From 6cb75aa4424a054a219d09361151f352112bb6da Mon Sep 17 00:00:00 2001 From: aleidk Date: Fri, 14 Feb 2025 11:29:03 -0300 Subject: [PATCH] feat: add minijinja as template engine --- Cargo.lock | 21 +++++++++++++++ Cargo.toml | 8 ++++-- build.rs | 5 ++++ src/error.rs | 9 +++++-- src/lib.rs | 25 ++++++++++++++++++ src/main.rs | 48 ++++++++++++++++------------------ src/router.rs | 17 ++++++++++++ templates/base.html | 14 ++++++++-- templates/index.html | 0 templates/partials/header.html | 34 ++++++++++++++++++++++++ 10 files changed, 150 insertions(+), 31 deletions(-) create mode 100644 build.rs create mode 100644 src/router.rs create mode 100644 templates/index.html create mode 100644 templates/partials/header.html diff --git a/Cargo.lock b/Cargo.lock index 8860c48..1dfce20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,6 +125,7 @@ version = "0.1.0" dependencies = [ "axum", "minijinja", + "minijinja-embed", "notify", "serde", "thiserror", @@ -387,6 +388,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memo-map" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" + [[package]] name = "mime" version = "0.3.17" @@ -399,9 +406,17 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cff7b8df5e85e30b87c2b0b3f58ba3a87b68e133738bf512a7713769326dbca9" dependencies = [ + "memo-map", + "self_cell", "serde", ] +[[package]] +name = "minijinja-embed" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff215cc12986bb95143f1af134415fa2554aacbb4f74416973549ac54ab0c907" + [[package]] name = "miniz_oxide" version = "0.8.4" @@ -595,6 +610,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "self_cell" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" + [[package]] name = "serde" version = "1.0.217" diff --git a/Cargo.toml b/Cargo.toml index e04800e..ca5ec09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,12 +5,16 @@ edition = "2021" [dependencies] axum = "0.8.1" -minijinja = "2.7.0" +minijinja = { version = "2.7.0", features = ["loader"] } +minijinja-embed = "2.7.0" notify = "8.0.0" -serde = "1.0.217" +serde = { version = "1.0.217", features = ["derive"] } thiserror = "2.0.11" tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread"] } tower-http = { version = "0.6.2", features = ["trace"] } tower-livereload = "0.9.6" tracing = "0.1.41" tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } + +[build-dependencies] +minijinja-embed = "2.7.0" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..99c7b3a --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +fn main() { + // only enable in production build + #[cfg(not(debug_assertions))] + minijinja_embed::embed_templates!("templates"); +} diff --git a/src/error.rs b/src/error.rs index d4fc4fb..f2dd780 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,5 +1,8 @@ -use axum::response::Html; -use axum::{http::StatusCode, response::IntoResponse}; +use axum::{ + http::StatusCode, + response::{Html, IntoResponse}, +}; +use tracing::debug; pub type Result = std::result::Result; @@ -34,6 +37,8 @@ impl IntoResponse for Error { ), }; + debug!(error = ?self); + (status, message).into_response() } } diff --git a/src/lib.rs b/src/lib.rs index 4163390..af51d94 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,28 @@ mod error; +pub mod router; pub use error::{Error, Result, ResultTemplate}; +use minijinja::{Environment, Template}; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; + +#[derive(Serialize, Deserialize, Debug)] +pub struct Link { + pub path: String, + pub text: String, + pub subpages: Vec, +} + +pub struct AppState { + tmpl_env: Environment<'static>, +} + +impl AppState { + pub fn new(tmpl_env: Environment<'static>) -> Arc { + Arc::new(AppState { tmpl_env }) + } + + pub fn get_template(&self, name: &str) -> Result