diff options
author | Vincent Ambo <tazjin@gmail.com> | 2018-04-08T15·30+0200 |
---|---|---|
committer | Vincent Ambo <tazjin@gmail.com> | 2018-04-08T15·30+0200 |
commit | 3db069c60d5696efc3d8772e07fec65d876b45e2 (patch) | |
tree | 31b6cb389d783104b185b5a0ab907e3e9decbad1 | |
parent | b83dd99e305f8de13211f14654b7bceb1c6024c1 (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.lock | 3 | ||||
-rw-r--r-- | Cargo.toml | 4 | ||||
-rw-r--r-- | src/main.rs | 37 | ||||
-rw-r--r-- | src/models.rs | 2 | ||||
-rw-r--r-- | templates/index.html | 14 |
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> |