diff options
author | Vincent Ambo <tazjin@gmail.com> | 2018-04-11T10·17+0200 |
---|---|---|
committer | Vincent Ambo <tazjin@gmail.com> | 2018-04-11T10·17+0200 |
commit | fe7e5e48b5702a0547b3008e06a1f0c04d88e3bf (patch) | |
tree | 5db3bf1889e0c0d5c3f384e9937cc7e0913b4689 | |
parent | 4eb0a57177b82c9d2fc65b610a77bb9fd3226693 (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.rs | 3 | ||||
-rw-r--r-- | src/render.rs | 70 |
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())?) + } +} |