use axum::{Router, body::Body, response::Response, routing::get}; use sqlx::SqlitePool; use std::sync::Arc; use tokio::net::TcpListener; use tower_sessions::{MemoryStore, SessionManagerLayer}; mod partials; mod station; #[macro_export] macro_rules! err { ($session:expr, $fmt:expr $(, $arg:expr)*) => { $session .insert( "err", &format!($fmt $(, $arg)*) ) .await .unwrap() }; } #[macro_export] macro_rules! succ { ($session:expr, $fmt:expr $(, $arg:expr)*) => { $session .insert( "succ", &format!($fmt $(, $arg)*) ) .await .unwrap() }; } const PICO_CSS: &str = include_str!("../assets/pico.classless.min.css"); const MY_CSS: &str = include_str!("../assets/style.css"); const LEAFLET_CSS: &str = include_str!("../assets/leaflet.css"); const LEAFLET_JS: &str = include_str!("../assets/leaflet.js"); const MARKER_PNG: &[u8] = include_bytes!("../assets/marker-icon.png"); async fn serve_pico_css() -> Response { Response::builder() .header("Content-Type", "text/css") .body(Body::from(PICO_CSS)) .unwrap() } async fn serve_my_css() -> Response { Response::builder() .header("Content-Type", "text/css") .body(Body::from(MY_CSS)) .unwrap() } async fn serve_leaflet_css() -> Response { Response::builder() .header("Content-Type", "text/css") .body(Body::from(LEAFLET_CSS)) .unwrap() } async fn serve_leaflet_js() -> Response { Response::builder() .header("Content-Type", "application/javascript") .body(Body::from(LEAFLET_JS)) .unwrap() } async fn serve_marker_png() -> Response { Response::builder() .header("Content-Type", "image/png") .body(Body::from(MARKER_PNG)) .unwrap() } /// Starts the main application. pub async fn start(listener: TcpListener, db: SqlitePool) { let session_store = MemoryStore::default(); let session_layer = SessionManagerLayer::new(session_store); let app = Router::new() .nest("/station", station::routes()) .route("/pico.css", get(serve_pico_css)) .route("/style.css", get(serve_my_css)) .route("/leaflet.css", get(serve_leaflet_css)) .route("/leaflet.js", get(serve_leaflet_js)) .route("/marker.png", get(serve_marker_png)) .with_state(Arc::new(db)) .layer(session_layer); axum::serve(listener, app).await.unwrap(); }