about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@gmail.com>2018-04-11T10·17+0200
committerVincent Ambo <tazjin@gmail.com>2018-04-11T10·17+0200
commitfe7e5e48b5702a0547b3008e06a1f0c04d88e3bf (patch)
tree5db3bf1889e0c0d5c3f384e9937cc7e0913b4689
parent4eb0a57177b82c9d2fc65b610a77bb9fd3226693 (diff)
feat(render): Add rendering actor
Adds a separate actor that handles page rendering, templating engine
state and other related topics.
-rw-r--r--src/main.rs3
-rw-r--r--src/render.rs70
2 files changed, 72 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs
index d748be64f945..72bc5e00e897 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -27,11 +27,12 @@ extern crate serde_json;
 extern crate url;
 extern crate url_serde;
 
-pub mod oidc;
 pub mod db;
 pub mod errors;
 pub mod handlers;
 pub mod models;
+pub mod oidc;
+pub mod render;
 pub mod schema;
 
 use actix::prelude::*;
diff --git a/src/render.rs b/src/render.rs
new file mode 100644
index 000000000000..8dfce219b215
--- /dev/null
+++ b/src/render.rs
@@ -0,0 +1,70 @@
+//! This module defines a rendering actor used for processing Converse
+//! data into whatever format is needed by the templates and rendering
+//! them.
+
+use actix::prelude::*;
+use actix_web::HttpResponse;
+use tera::{Context, Tera};
+use models::*;
+use errors::*;
+
+pub struct Renderer(pub Tera);
+
+impl Actor for Renderer {
+    type Context = actix::Context<Self>;
+}
+
+/// Message used to render the index page.
+pub struct IndexPage {
+    pub threads: Vec<Thread>,
+}
+
+impl Message for IndexPage {
+    type Result = Result<String>;
+}
+
+impl Handler<IndexPage> for Renderer {
+    type Result = Result<String>;
+
+    fn handle(&mut self, msg: IndexPage, _: &mut Self::Context) -> Self::Result {
+        let mut ctx = Context::new();
+        ctx.add("threads", &msg.threads);
+        Ok(self.0.render("index.html", &ctx)?)
+    }
+}
+
+/// Message used to render a thread.
+pub struct ThreadPage {
+    pub thread: Thread,
+    pub posts: Vec<Post>,
+}
+
+impl Message for ThreadPage {
+    type Result = Result<String>;
+}
+
+impl Handler<ThreadPage> for Renderer {
+    type Result = Result<String>;
+
+    fn handle(&mut self, msg: ThreadPage, _: &mut Self::Context) -> Self::Result {
+        let mut ctx = Context::new();
+        ctx.add("thread", &msg.thread);
+        ctx.add("posts", &msg.posts);
+        Ok(self.0.render("thread.html", &ctx)?)
+    }
+}
+
+/// Message used to render new thread page.
+pub struct NewThreadPage;
+
+impl Message for NewThreadPage {
+    type Result = Result<String>;
+}
+
+impl Handler<NewThreadPage> for Renderer {
+    type Result = Result<String>;
+
+    fn handle(&mut self, _: NewThreadPage, _: &mut Self::Context) -> Self::Result {
+        Ok(self.0.render("new-thread.html", &Context::new())?)
+    }
+}