feat(render): Add rendering actor

Adds a separate actor that handles page rendering, templating engine
state and other related topics.
This commit is contained in:
Vincent Ambo 2018-04-11 12:17:33 +02:00
parent 4eb0a57177
commit fe7e5e48b5
2 changed files with 72 additions and 1 deletions

View file

@ -27,11 +27,12 @@ extern crate serde_json;
extern crate url; extern crate url;
extern crate url_serde; extern crate url_serde;
pub mod oidc;
pub mod db; pub mod db;
pub mod errors; pub mod errors;
pub mod handlers; pub mod handlers;
pub mod models; pub mod models;
pub mod oidc;
pub mod render;
pub mod schema; pub mod schema;
use actix::prelude::*; use actix::prelude::*;

70
src/render.rs Normal file
View file

@ -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())?)
}
}