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>