use axum::{ extract::{Path, State}, http::{header, HeaderMap, HeaderValue}, response::Html, routing::get, Router, }; use axum_htmx::HxRequest; use chrono::Utc; use minijinja::context; use serde::Serialize; use sqlx::prelude::FromRow; use crate::{AppState, Result, ResultTemplate, Tx}; pub fn new() -> Router { Router::new() .route("/", get(handler_home)) .route("/assets/{*asset}", get(handle_assets)) } async fn handle_assets( State(state): State, Path(asset): Path, ) -> Result<(HeaderMap, String)> { let mut headers = HeaderMap::new(); let mime = mime_guess::from_path(&asset).first_raw(); if let Some(mime) = mime { headers.insert(header::CONTENT_TYPE, HeaderValue::from_static(mime)); } let template = state.tmpl_env.get_template(&format!("assets/{}", asset))?; Ok((headers, template.render(context!())?)) } #[derive(FromRow, Debug, Serialize)] struct ExampleRow { pub database: String, pub version: String, pub current_database: String, pub current_user: String, pub current_timestamp: chrono::DateTime, } async fn handler_home( State(state): State, HxRequest(hx_request): HxRequest, mut tx: Tx, ) -> ResultTemplate { let template = state.tmpl_env.get_template("index.html")?; let rows = sqlx::query_as::<_, ExampleRow>("select 'Postgres' as database, setting as version, current_database(), current_user, current_timestamp from pg_settings where name = 'server_version'") .fetch_all(&mut tx) .await?; println!("{:?}", rows); let content = if hx_request { template .eval_to_state(context!(rows => rows))? .render_block("htmx")? } else { template.render(context!(rows => rows))? }; Ok(Html(content)) }