From 11bd5897bfb5c73375e319a8319a6402002312a2 Mon Sep 17 00:00:00 2001 From: Nathan McCarty Date: Wed, 26 Jul 2023 03:15:56 -0400 Subject: [PATCH] feat: Template index --- Cargo.lock | 87 +++++++++++++++++++++++++++++++++ Cargo.toml | 1 + assets/templates/index.html | 21 ++++++++ src/bin/stranger-site-server.rs | 11 +++-- src/lib.rs | 14 ++++++ src/routes/index.rs | 25 ++++++++-- 6 files changed, 151 insertions(+), 8 deletions(-) create mode 100644 assets/templates/index.html diff --git a/Cargo.lock b/Cargo.lock index ac767a4..e408c33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -205,6 +205,33 @@ dependencies = [ "phf_codegen", ] +[[package]] +name = "color-eyre" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + [[package]] name = "core-foundation-sys" version = "0.8.4" @@ -246,6 +273,16 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fnv" version = "1.0.7" @@ -457,6 +494,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "itoa" version = "1.0.9" @@ -584,6 +627,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + [[package]] name = "parking_lot" version = "0.12.1" @@ -912,6 +961,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -957,6 +1015,7 @@ name = "stranger-site" version = "0.1.0-dev.0" dependencies = [ "axum", + "color-eyre", "jotdown", "tera", "tokio", @@ -1109,6 +1168,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", ] [[package]] @@ -1194,6 +1275,12 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index b74d4bc..da3c509 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ license-file = "LICENSE.md" [dependencies] axum = "0.6.19" +color-eyre = "0.6.2" jotdown = "0.3.0" tera = "1.19.0" tokio = { version = "1.29.1", features = ["full"] } diff --git a/assets/templates/index.html b/assets/templates/index.html new file mode 100644 index 0000000..eaa1bd5 --- /dev/null +++ b/assets/templates/index.html @@ -0,0 +1,21 @@ + + + + + {{ title }} + + + + + + + +

Welcome to {{ title }}!

+ + diff --git a/src/bin/stranger-site-server.rs b/src/bin/stranger-site-server.rs index fed6a71..d512de4 100644 --- a/src/bin/stranger-site-server.rs +++ b/src/bin/stranger-site-server.rs @@ -1,14 +1,15 @@ use axum::{routing::get, Router}; use std::{net::SocketAddr, sync::Arc}; +use color_eyre::eyre::{Context, Result}; use stranger_site::{routes::index::index, AppState}; #[tokio::main] -async fn main() { +async fn main() -> Result<()> { + // Install color-eyre + color_eyre::install()?; // Build our state - let shared_state = AppState { - title: "Stranger Systems".to_string(), - }; + let shared_state = AppState::new("Stranger Systems").context("Failed building app state")?; // build our application with a route let app = Router::new() .route("/", get(index)) @@ -23,4 +24,6 @@ async fn main() { .serve(app.into_make_service()) .await .unwrap(); + + Ok(()) } diff --git a/src/lib.rs b/src/lib.rs index cdd2eff..0f5cf1c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,20 @@ +use color_eyre::eyre::{Context, Result}; +use tera::Tera; + pub mod routes; /// Shared state for the application pub struct AppState { pub title: String, + pub tera: Tera, +} + +impl AppState { + pub fn new(title: impl AsRef) -> Result { + let title = title.as_ref().to_string(); + let mut tera = Tera::default(); + tera.add_raw_template("index.html", include_str!("../assets/templates/index.html")) + .context("Failed to load built in template for index.html")?; + Ok(AppState { title, tera }) + } } diff --git a/src/routes/index.rs b/src/routes/index.rs index 6c927e7..f1da743 100644 --- a/src/routes/index.rs +++ b/src/routes/index.rs @@ -1,11 +1,28 @@ use std::sync::Arc; -use axum::{extract::State, response::Html}; +use axum::{extract::State, http::StatusCode, response::Html}; +use color_eyre::eyre::Context; use crate::AppState; /// Render the front page -pub async fn index(State(state): State>) -> Html { - let title: &str = state.title.as_ref(); - Html(format!("

Hello, World! Site Title: {title}

")) +async fn index_inner(State(state): State>) -> color_eyre::eyre::Result> { + eprintln!("Rendering index page"); + let mut context = tera::Context::new(); + context.insert("title", &state.title); + let rendered = state + .tera + .render("index.html", &context) + .context("Failed rendering index.html")?; + Ok(Html(rendered)) +} + +pub async fn index(state: State>) -> Result, (StatusCode, String)> { + match index_inner(state).await { + Ok(x) => Ok(x), + Err(err) => { + let err = format!("{:?}", err); + Err((StatusCode::BAD_REQUEST, err)) + } + } }