about summary refs log tree commit diff
path: root/src/render.rs
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 /src/render.rs
parent4eb0a57177b82c9d2fc65b610a77bb9fd3226693 (diff)
feat(render): Add rendering actor
Adds a separate actor that handles page rendering, templating engine
state and other related topics.
Diffstat (limited to 'src/render.rs')
-rw-r--r--src/render.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/render.rs b/src/render.rs
new file mode 100644
index 0000000000..8dfce219b2
--- /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())?)
+    }
+}