From 2f6699aeaeefed7ab204c75100068fe9d97ee81f Mon Sep 17 00:00:00 2001 From: David Pedersen <david.pdrsn@gmail.com> Date: Sun, 13 Jun 2021 13:58:12 +0200 Subject: [PATCH] Add HTML template example (#17) --- Cargo.toml | 1 + askama.toml | 4 +++ examples/templates.rs | 54 +++++++++++++++++++++++++++++++++++ examples/templates/hello.html | 1 + 4 files changed, 60 insertions(+) create mode 100644 askama.toml create mode 100644 examples/templates.rs create mode 100644 examples/templates/hello.html diff --git a/Cargo.toml b/Cargo.toml index 27bf2e32..cce7af88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,7 @@ sha-1 = { optional = true, version = "0.9.6" } base64 = { optional = true, version = "0.13" } [dev-dependencies] +askama = "0.10.5" hyper = { version = "0.14", features = ["full"] } reqwest = { version = "0.11", features = ["json", "stream"] } serde = { version = "1.0", features = ["derive"] } diff --git a/askama.toml b/askama.toml new file mode 100644 index 00000000..00d895f5 --- /dev/null +++ b/askama.toml @@ -0,0 +1,4 @@ +# used to configure askama used in some examples + +[general] +dirs = ["examples/templates"] diff --git a/examples/templates.rs b/examples/templates.rs new file mode 100644 index 00000000..cc1c8744 --- /dev/null +++ b/examples/templates.rs @@ -0,0 +1,54 @@ +use askama::Template; +use awebframework::{prelude::*, response::IntoResponse}; +use http::{Response, StatusCode}; +use std::net::SocketAddr; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + + // build our application with some routes + let app = route("/greet/:name", get(greet)); + + // run it + let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); + tracing::debug!("listening on {}", addr); + app.serve(&addr).await.unwrap(); +} + +async fn greet(params: extract::UrlParamsMap) -> impl IntoResponse { + let name = params + .get("name") + .expect("`name` will be there if route was matched") + .to_string(); + + let template = HelloTemplate { name }; + + HtmlTemplate(template) +} + +#[derive(Template)] +#[template(path = "hello.html")] +struct HelloTemplate { + name: String, +} + +struct HtmlTemplate<T>(T); + +impl<T> IntoResponse for HtmlTemplate<T> +where + T: Template, +{ + fn into_response(self) -> http::Response<Body> { + match self.0.render() { + Ok(html) => response::Html(html).into_response(), + Err(err) => Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(Body::from(format!( + "Failed to render template. Error: {}", + err + ))) + .unwrap(), + } + } +} diff --git a/examples/templates/hello.html b/examples/templates/hello.html new file mode 100644 index 00000000..33fdc85e --- /dev/null +++ b/examples/templates/hello.html @@ -0,0 +1 @@ +<h1>Hello, {{ name }}!</h1>