From cf590046e9829b569d5ecd7fb2ed7f10ddc6ffe2 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 11 May 2024 22:14:46 +0200 Subject: [PATCH] Use maud for test page I want to replace askama with maud completely. It's so much nicer to be able to use Rust code and abstractions (e.g. functions) to compose HTML than using a bespoke templating system with weird inheritance and stuff. Even though said template system is checked at compile time. Actually, since it doesn't do hot reloading anyways, maud requiring a recompile for changes to become visible doesn't make the situation worse. --- Cargo.lock | 48 ++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/server/web.rs | 2 ++ src/server/web/base.rs | 29 ++++++++++++++++++++++ src/server/web/pages.rs | 1 + src/server/web/pages/test.rs | 27 ++++++++++++++++++++ src/server/web/paths.rs | 4 +++ 7 files changed, 112 insertions(+) create mode 100644 src/server/web/pages/test.rs diff --git a/Cargo.lock b/Cargo.lock index acf95bb..90e72b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1969,6 +1969,30 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "maud" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df518b75016b4289cdddffa1b01f2122f4a49802c93191f3133f6dc2472ebcaa" +dependencies = [ + "axum-core", + "http", + "itoa", + "maud_macros", +] + +[[package]] +name = "maud_macros" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa453238ec218da0af6b11fc5978d3b5c3a45ed97b722391a2a11f3306274e18" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.62", +] + [[package]] name = "md-5" version = "0.10.6" @@ -2278,6 +2302,29 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.82" @@ -3165,6 +3212,7 @@ dependencies = [ "gix", "humantime", "log", + "maud", "mime_guess", "open", "rand", diff --git a/Cargo.toml b/Cargo.toml index caa7133..1495c00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ futures = "0.3.30" gethostname = "0.4.3" humantime = "2.1.0" log = "0.4.21" +maud = { version = "0.26.0", features = ["axum"] } mime_guess = "2.0.4" open = "5.1.2" rand = "0.8.5" diff --git a/src/server/web.rs b/src/server/web.rs index 0ac52af..4563ae3 100644 --- a/src/server/web.rs +++ b/src/server/web.rs @@ -31,6 +31,7 @@ use self::{ index::get_index, queue::{get_queue, get_queue_delete, get_queue_inner}, run::get_run_by_id, + test::get_test, worker::get_worker_by_name, }, }; @@ -57,6 +58,7 @@ pub async fn run(server: Server) -> somehow::Result<()> { .typed_get(get_queue_delete) .typed_get(get_queue_inner) .typed_get(get_run_by_id) + .typed_get(get_test) .typed_get(get_worker_by_name) .typed_post(post_admin_queue_add) .typed_post(post_admin_queue_add_batch) diff --git a/src/server/web/base.rs b/src/server/web/base.rs index 85fe23c..af8a581 100644 --- a/src/server/web/base.rs +++ b/src/server/web/base.rs @@ -1,5 +1,7 @@ use std::fmt; +use maud::{html, Markup, DOCTYPE}; + use crate::config::ServerConfig; use super::{ @@ -60,6 +62,33 @@ impl Base { pub fn link(&self, to: P) -> Link { Self::link_with_base(&self.web_base, to) } + + pub fn html(&self, title: &str, head: Markup, body: Markup) -> Markup { + html!( + (DOCTYPE) + html lang="en" { + head { + meta charset="utf-8"; + meta name="viewport" content="width=device-width"; + title { (title) " - " (self.repo_name) } + link rel="icon" href=(self.link_logo_svg); + link rel="stylesheet" href=(self.link_base_css); + (head) + } + body { + nav { + a .current[self.tab == "index"] href=(self.link_index) { + img src=(self.link_logo_svg) alt=""; + (self.repo_name) + } + a .current[self.tab == "graph"] href=(self.link_graph) { "graph" } + a .current[self.tab == "queue"] href=(self.link_queue) { "queue" } + } + (body) + } + } + ) + } } #[derive(Clone)] diff --git a/src/server/web/pages.rs b/src/server/web/pages.rs index 427d3fe..6ca9788 100644 --- a/src/server/web/pages.rs +++ b/src/server/web/pages.rs @@ -3,6 +3,7 @@ pub mod graph; pub mod index; pub mod queue; pub mod run; +pub mod test; pub mod worker; // TODO Admin page with vacuum+analyze, deleting output? diff --git a/src/server/web/pages/test.rs b/src/server/web/pages/test.rs new file mode 100644 index 0000000..c1fe02b --- /dev/null +++ b/src/server/web/pages/test.rs @@ -0,0 +1,27 @@ +use axum::{extract::State, response::IntoResponse}; +use maud::html; + +use crate::{ + config::ServerConfig, + server::web::{ + base::{Base, Tab}, + paths::PathTest, + }, + somehow, +}; + +pub async fn get_test( + _path: PathTest, + State(config): State<&'static ServerConfig>, +) -> somehow::Result { + let base = Base::new(config, Tab::Index); + + Ok(base.html( + "test", + html! {}, + html! { + h2 { "Test" } + p { "Hello world!" } + }, + )) +} diff --git a/src/server/web/paths.rs b/src/server/web/paths.rs index 01fe735..ec847fe 100644 --- a/src/server/web/paths.rs +++ b/src/server/web/paths.rs @@ -57,6 +57,10 @@ pub struct PathWorkerByName { pub name: String, } +#[derive(Deserialize, TypedPath)] +#[typed_path("/test")] +pub struct PathTest {} + /////////////////// // Admin actions // ///////////////////