feat: add basic template functionality

This commit is contained in:
Alexander Navarro 2025-02-13 14:58:21 -03:00
parent b6c909f6f4
commit 6bf3947df3
5 changed files with 52 additions and 3 deletions

View file

@ -10,7 +10,7 @@ docker-compose +ARGS:
start-dev-services: (docker-compose "up --remove-orphans") start-dev-services: (docker-compose "up --remove-orphans")
dev: dev:
watchexec --restart --clear --watch src cargo run watchexec --restart --clear --watch src --watch templates cargo run
migrate: (docker-compose "run dbmate migrate") migrate: (docker-compose "run dbmate migrate")

13
Cargo.lock generated
View file

@ -115,7 +115,9 @@ name = "compendium"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"axum", "axum",
"minijinja",
"notify", "notify",
"serde",
"tokio", "tokio",
"tower-livereload", "tower-livereload",
] ]
@ -363,6 +365,15 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "minijinja"
version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cff7b8df5e85e30b87c2b0b3f58ba3a87b68e133738bf512a7713769326dbca9"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.4" version = "0.8.4"
@ -699,7 +710,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]

View file

@ -5,6 +5,8 @@ edition = "2021"
[dependencies] [dependencies]
axum = "0.8.1" axum = "0.8.1"
minijinja = "2.7.0"
notify = "8.0.0" notify = "8.0.0"
serde = "1.0.217"
tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread"] } tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread"] }
tower-livereload = "0.9.6" tower-livereload = "0.9.6"

View file

@ -1,10 +1,28 @@
use std::sync::Arc;
use axum::extract::State;
use axum::http::StatusCode;
use axum::response::Html; use axum::response::Html;
use axum::routing::get; use axum::routing::get;
use axum::Router; use axum::Router;
use minijinja::{context, Environment};
struct AppState {
tmpl_env: Environment<'static>,
}
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
let app = Router::new().route("/", get(|| async { Html("<h1>Hello, World! 2</h1>") })); let mut tmpl_env = Environment::new();
tmpl_env
.add_template("base", include_str!("../templates/base.html"))
.unwrap();
let app_state = Arc::new(AppState { tmpl_env });
let app = Router::new()
.route("/", get(handler_home))
.with_state(app_state);
// Add hot reload only on dev mode // Add hot reload only on dev mode
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
@ -13,3 +31,11 @@ async fn main() {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await.unwrap();
} }
async fn handler_home(State(state): State<Arc<AppState>>) -> Result<Html<String>, StatusCode> {
let template = state.tmpl_env.get_template("base").unwrap();
let content = template.render(context!()).unwrap();
Ok(Html(content))
}

10
templates/base.html Normal file
View file

@ -0,0 +1,10 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Compendium</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>