stationslauf/src/lib.rs
2025-04-06 23:12:50 +02:00

93 lines
2.5 KiB
Rust

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<Body> {
Response::builder()
.header("Content-Type", "text/css")
.body(Body::from(PICO_CSS))
.unwrap()
}
async fn serve_my_css() -> Response<Body> {
Response::builder()
.header("Content-Type", "text/css")
.body(Body::from(MY_CSS))
.unwrap()
}
async fn serve_leaflet_css() -> Response<Body> {
Response::builder()
.header("Content-Type", "text/css")
.body(Body::from(LEAFLET_CSS))
.unwrap()
}
async fn serve_leaflet_js() -> Response<Body> {
Response::builder()
.header("Content-Type", "application/javascript")
.body(Body::from(LEAFLET_JS))
.unwrap()
}
async fn serve_marker_png() -> Response<Body> {
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();
}