use axum::Router; use servable::{ CACHE_BUST_STR, Redirect, ServableRouter, ServableWithRoute, StaticAsset, mime::MimeType, }; use tower_http::compression::{CompressionLayer, DefaultPredicate}; use crate::pages; pub(super) fn router() -> Router<()> { let compression: CompressionLayer = CompressionLayer::new() .br(true) .deflate(true) .gzip(true) .zstd(true) .compress_when(DefaultPredicate::new()); build_server().into_router().layer(compression) } pub static HTMX: ServableWithRoute = ServableWithRoute::new( || "/assets/htmx-2.0.8.js".into(), servable::HTMX_2_0_8.with_ttl(None), ); pub static HTMX_JSON: ServableWithRoute = ServableWithRoute::new( || "/assets/htmx-json-1.19.12.js".into(), servable::EXT_JSON_1_19_12, ); pub static MAIN_CSS: ServableWithRoute = ServableWithRoute::new( || format!("/assets/{}/css/main.css", *CACHE_BUST_STR), StaticAsset { bytes: grass::include!("css/main.scss").as_bytes(), mime: MimeType::Css, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static IMG_COVER_SMALL: ServableWithRoute = ServableWithRoute::new( || "/assets/img/cover-small.jpg".into(), StaticAsset { bytes: include_bytes!("../../assets/images/cover-small.jpg"), mime: MimeType::Jpg, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static IMG_BETALUPI: ServableWithRoute = ServableWithRoute::new( || "/assets/img/betalupi.png".into(), StaticAsset { bytes: include_bytes!("../../assets/images/betalupi-map.png"), mime: MimeType::Png, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static IMG_ICON: ServableWithRoute = ServableWithRoute::new( || "/assets/img/icon.png".into(), StaticAsset { bytes: include_bytes!("../../assets/images/icon.png"), mime: MimeType::Png, ttl: StaticAsset::DEFAULT_TTL, }, ); // // MARK: fonts // pub static FONT_FIRACODE_BOLD: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/FiraCode-Bold.woff2".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fira/FiraCode-Bold.woff2"), mime: MimeType::Woff2, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FIRACODE_LIGHT: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/FiraCode-Light.woff2".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fira/FiraCode-Light.woff2"), mime: MimeType::Woff2, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FIRACODE_MEDIUM: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/FiraCode-Medium.woff2".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fira/FiraCode-Medium.woff2"), mime: MimeType::Woff2, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FIRACODE_REGULAR: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/FiraCode-Regular.woff2".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fira/FiraCode-Regular.woff2"), mime: MimeType::Woff2, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FIRACODE_SEMIBOLD: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/FiraCode-SemiBold.woff2".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fira/FiraCode-SemiBold.woff2"), mime: MimeType::Woff2, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FIRACODE_VF: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/FiraCode-VF.woff2".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fira/FiraCode-VF.woff2"), mime: MimeType::Woff2, ttl: StaticAsset::DEFAULT_TTL, }, ); // // MARK: icons // pub static FONT_FA_BRANDS_WOFF2: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/fa/fa-brands-400.woff2".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fa/fa-brands-400.woff2"), mime: MimeType::Woff2, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FA_REGULAR_WOFF2: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/fa/fa-regular-400.woff2".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fa/fa-regular-400.woff2"), mime: MimeType::Woff2, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FA_SOLID_WOFF2: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/fa/fa-solid-900.woff2".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fa/fa-solid-900.woff2"), mime: MimeType::Woff2, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FA_BRANDS_TTF: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/fa/fa-brands-400.ttf".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fa/fa-brands-400.ttf"), mime: MimeType::Ttf, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FA_REGULAR_TTF: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/fa/fa-regular-400.ttf".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fa/fa-regular-400.ttf"), mime: MimeType::Ttf, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static FONT_FA_SOLID_TTF: ServableWithRoute = ServableWithRoute::new( || "/assets/fonts/fa/fa-solid-900.ttf".into(), StaticAsset { bytes: include_bytes!("../../assets/fonts/fa/fa-solid-900.ttf"), mime: MimeType::Ttf, ttl: StaticAsset::DEFAULT_TTL, }, ); // // MARK: htwah // pub static HTWAH_DEFINITIONS: ServableWithRoute = ServableWithRoute::new( || "/assets/htwah/definitions.pdf".into(), StaticAsset { bytes: include_bytes!("../../assets/htwah/definitions.pdf"), mime: MimeType::Pdf, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static HTWAH_NUMBERING: ServableWithRoute = ServableWithRoute::new( || "/assets/htwah/numbering.pdf".into(), StaticAsset { bytes: include_bytes!("../../assets/htwah/numbering.pdf"), mime: MimeType::Pdf, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static HTWAH_SOLS_A: ServableWithRoute = ServableWithRoute::new( || "/assets/htwah/sols-a.pdf".into(), StaticAsset { bytes: include_bytes!("../../assets/htwah/sols-a.pdf"), mime: MimeType::Pdf, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static HTWAH_SOLS_B: ServableWithRoute = ServableWithRoute::new( || "/assets/htwah/sols-b.pdf".into(), StaticAsset { bytes: include_bytes!("../../assets/htwah/sols-b.pdf"), mime: MimeType::Pdf, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static HTWAH_SPACING_A: ServableWithRoute = ServableWithRoute::new( || "/assets/htwah/spacing-a.pdf".into(), StaticAsset { bytes: include_bytes!("../../assets/htwah/spacing-a.pdf"), mime: MimeType::Pdf, ttl: StaticAsset::DEFAULT_TTL, }, ); pub static HTWAH_SPACING_B: ServableWithRoute = ServableWithRoute::new( || "/assets/htwah/spacing-b.pdf".into(), StaticAsset { bytes: include_bytes!("../../assets/htwah/spacing-b.pdf"), mime: MimeType::Pdf, ttl: StaticAsset::DEFAULT_TTL, }, ); fn build_server() -> ServableRouter { ServableRouter::new() .with_404(&pages::NOT_FOUND) .add_page("/", &pages::INDEX) .add_page("/links", pages::LINKS) .add_page("/whats-a-betalupi", pages::BETALUPI) .add_page("/handouts", &pages::HANDOUTS) .add_page("/htwah", { #[expect(clippy::unwrap_used)] Redirect::new("/handouts").unwrap() }) .add_page("/htwah/typesetting", pages::HTWAH_TYPESETTING) .add_page_with_route(&HTMX) .add_page_with_route(&HTMX_JSON) // .add_page_with_route(&MAIN_CSS) .add_page_with_route(&IMG_COVER_SMALL) .add_page_with_route(&IMG_BETALUPI) .add_page_with_route(&IMG_ICON) // // MARK: fonts // .add_page_with_route(&FONT_FIRACODE_BOLD) .add_page_with_route(&FONT_FIRACODE_LIGHT) .add_page_with_route(&FONT_FIRACODE_MEDIUM) .add_page_with_route(&FONT_FIRACODE_REGULAR) .add_page_with_route(&FONT_FIRACODE_SEMIBOLD) .add_page_with_route(&FONT_FIRACODE_VF) // // MARK: icons // .add_page_with_route(&FONT_FA_BRANDS_WOFF2) .add_page_with_route(&FONT_FA_REGULAR_WOFF2) .add_page_with_route(&FONT_FA_SOLID_WOFF2) .add_page_with_route(&FONT_FA_BRANDS_TTF) .add_page_with_route(&FONT_FA_REGULAR_TTF) .add_page_with_route(&FONT_FA_SOLID_TTF) // // MARK: htwah // .add_page_with_route(&HTWAH_DEFINITIONS) .add_page_with_route(&HTWAH_NUMBERING) .add_page_with_route(&HTWAH_SOLS_A) .add_page_with_route(&HTWAH_SOLS_B) .add_page_with_route(&HTWAH_SPACING_A) .add_page_with_route(&HTWAH_SPACING_B) } #[test] fn server_builds_without_panic() { tokio::runtime::Builder::new_current_thread() .enable_all() .build() .unwrap() .block_on(async { let _server = build_server(); }); }