use anyhow::Context; use askama::Template; use axum::{ response::IntoResponse, routing::get, Router, }; use tower_http::services::ServeDir; use tracing::info; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; mod html; pub async fn run() -> anyhow::Result<()> { tracing_subscriber::registry() .with( tracing_subscriber::EnvFilter::try_from_default_env() .unwrap_or_else(|_| "achubb_backend".into()), ) .with(tracing_subscriber::fmt::layer()) .init(); info!("initializing router..."); let assets_path = std::env::current_dir().unwrap(); let port = 8000_u16; let addr = std::net::SocketAddr::from(([0, 0, 0, 0], port)); let api_router = Router::new().route("/hello", get(hello_from_the_server)); let router = Router::new() .nest("/api", api_router) .route("/", get(hello)) .route("/navbar", get(navbar)) .route("/another-page", get(another_page)) .nest_service( "/assets", ServeDir::new(format!("{}/assets", assets_path.to_str().unwrap())), ); info!("router initialized, now listening on port {}", port); axum::Server::bind(&addr) .serve(router.into_make_service()) .await .context("error while starting server")?; Ok(()) } async fn hello() -> impl IntoResponse { let template = HelloTemplate {}; html::HtmlTemplate(template) } #[derive(Template)] #[template(path = "hello.html")] struct HelloTemplate; #[derive(Template)] #[template(path = "test-navbar.html")] struct NavbarTemplate; async fn navbar() -> impl IntoResponse { let template = NavbarTemplate {}; html::HtmlTemplate(template) } async fn another_page() -> impl IntoResponse { let template = AnotherPageTemplate {}; html::HtmlTemplate(template) } #[derive(Template)] #[template(path = "another-page.html")] struct AnotherPageTemplate; async fn hello_from_the_server() -> &'static str { "Hello!" }