use axum::{http::Request, response::Response, routing::get, Router}; use std::{net::SocketAddr, time::Duration}; use text::EmbeddedFonts; use tower_http::{catch_panic::CatchPanicLayer, trace::TraceLayer}; use tracing::Span; use crate::routes::static_files; mod color; mod polygon; mod routes; mod text; #[derive(Clone)] pub struct SharedState { fonts: EmbeddedFonts, } #[tokio::main] async fn main() { let state = SharedState { fonts: EmbeddedFonts::load(), }; let app = Router::new() .fallback(static_files::router) .route("/logo", get(routes::logo::png)) .route("/logo.png", get(routes::logo::png)) .nest("/favicon.ico", routes::favicon::routes()) .layer( TraceLayer::new_for_http() .on_request(|request: &Request<_>, _span: &Span| { println!("Request {} {}", request.method(), request.uri()); }) .on_response(|response: &Response, latency: Duration, _span: &Span| { println!("Response {}, {}ms", response.status(), latency.as_millis()); }), ) .layer(CatchPanicLayer::new()) .with_state(state); // run it let addr = SocketAddr::from(([0, 0, 0, 0], 3000)); println!("listening on {}", addr); axum::Server::bind(&addr) .serve(app.into_make_service()) .await .unwrap(); }