about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@gmail.com>2018-04-08T15·30+0200
committerVincent Ambo <tazjin@gmail.com>2018-04-08T15·30+0200
commit3db069c60d5696efc3d8772e07fec65d876b45e2 (patch)
tree31b6cb389d783104b185b5a0ab907e3e9decbad1
parentb83dd99e305f8de13211f14654b7bceb1c6024c1 (diff)
feat(main): Add support for Tera templates
Sets up the structure required to carry Tera templates in the
actix-web state.

The (still very barebones) index renderer has been updated to render a
Tera template.
-rw-r--r--Cargo.lock3
-rw-r--r--Cargo.toml4
-rw-r--r--src/main.rs37
-rw-r--r--src/models.rs2
-rw-r--r--templates/index.html14
5 files changed, 44 insertions, 16 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 66412d5c00ac..7b84193ebe77 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -238,6 +238,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -253,6 +254,8 @@ dependencies = [
  "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "r2d2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "tera 0.11.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
diff --git a/Cargo.toml b/Cargo.toml
index ecc2fc606f50..76dccad89b00 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,8 +8,10 @@ actix = "0.5"
 actix-web = { git="https://github.com/actix/actix-web.git" }
 env_logger = "0.5"
 diesel = { version = "1.2", features = ["postgres", "chrono", "r2d2"]}
-chrono = "0.4"
+chrono = { version = "0.4", features = ["serde"] }
 log = "0.4"
 r2d2 = "*"
 futures = "*"
 tera = "0.11"
+serde = "1.0"
+serde_derive = "1.0"
diff --git a/src/main.rs b/src/main.rs
index 559db8cc9662..419829b3e188 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,12 +4,19 @@ extern crate diesel;
 #[macro_use]
 extern crate log;
 
+#[macro_use]
+extern crate tera;
+
+#[macro_use]
+extern crate serde_derive;
+
 extern crate chrono;
 extern crate actix;
 extern crate actix_web;
 extern crate env_logger;
 extern crate r2d2;
 extern crate futures;
+extern crate serde;
 
 pub mod schema;
 pub mod models;
@@ -27,28 +34,27 @@ use models::Thread;
 
 /// Represents the state carried by the web server actors.
 struct AppState {
+    /// Address of the database actor
     db: Addr<Syn, DbExecutor>,
+
+    /// Compiled templates
+    tera: tera::Tera,
 }
 
 /// Really inefficient renderer example!
-fn render_threads(threads: Vec<Thread>) -> String {
-    let mut res = String::new();
-
-    for thread in threads {
-        res.push_str(&format!("Subject: {}\n", thread.title));
-        res.push_str(&format!("Posted at: {}\n\n", thread.posted));
-        res.push_str(&format!("{}\n", thread.body));
-        res.push_str("-------------------------------");
-    }
-
-    res
+fn render_threads(tpl: &tera::Tera, threads: Vec<Thread>) -> String {
+    let mut ctx = tera::Context::new();
+    ctx.add("threads", &threads);
+    tpl.render("index.html", &ctx).expect("Oh no")
 }
 
 fn forum_index(req: HttpRequest<AppState>) -> FutureResponse<HttpResponse> {
     req.state().db.send(ListThreads)
         .from_err()
-        .and_then(|res| match res {
-            Ok(threads) => Ok(HttpResponse::from(render_threads(threads))),
+        .and_then(move |res| match res {
+            Ok(threads) => Ok(HttpResponse::Ok()
+                              .content_type("text/html")
+                              .body(render_threads(&req.state().tera, threads))),
             Err(err) => {
                 error!("Error loading threads: {}", err);
                 Ok(HttpResponse::InternalServerError().into())
@@ -74,7 +80,10 @@ fn main() {
 
     info!("Initialising HTTP server ...");
     server::new(move || {
-        App::with_state(AppState { db: db_addr.clone() })
+        let template_path = concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*");
+        let tera = compile_templates!(template_path);
+
+        App::with_state(AppState { db: db_addr.clone(), tera })
             .middleware(middleware::Logger::default())
             .route("/", http::Method::GET, &forum_index)
     }).bind("127.0.0.1:4567").unwrap().start();
diff --git a/src/models.rs b/src/models.rs
index e502891305a2..929bd0507e94 100644
--- a/src/models.rs
+++ b/src/models.rs
@@ -1,6 +1,6 @@
 use chrono::prelude::{DateTime, Utc};
 
-#[derive(Queryable)]
+#[derive(Queryable, Serialize)]
 pub struct Thread {
     pub id: i32,
     pub title: String,
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 000000000000..566715248a80
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Converse Index page</title>
+  </head>
+  <body>
+    <h1>Welcome to Converse</h1>
+    <ul>
+      {% for thread in threads -%}
+        <li>{{ thread.title }} (posted at {{ thread.posted }})</li>
+      {%- endfor %}
+    </ul>
+  </body>
+</html>