From 432d3fce601e9ddc2060519053791f832cb98492 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sun, 9 Jul 2017 05:23:03 -0400 Subject: add: Display quotes from sqlite. --- src/server.rs | 79 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 22 deletions(-) (limited to 'src/server.rs') diff --git a/src/server.rs b/src/server.rs index 37c5713..4af8c83 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,37 +1,72 @@ -use iron::headers::{ContentType}; -use iron::modifiers::{Header}; -use iron::{Iron, Chain, Request, Response, IronResult, status}; +use data; + use handlebars_iron::{HandlebarsEngine, MemorySource, Template}; +use iron::headers::ContentType; +use iron::modifiers::Header; +use iron::{self, Iron, Plugin, Chain, Request, Response, IronResult, status}; +use rusqlite::Connection; use std::collections::BTreeMap; -use data; +use persistent::Write; +use handlebars_iron::handlebars::to_json; +use serde_json::{Value, Map}; -fn renderer() -> HandlebarsEngine { - let mut e = HandlebarsEngine::new(); +#[derive(Debug)] +pub struct State { + pub connection: Connection, +} +impl iron::typemap::Key for State { + type Value = State; +} - let mut templates = BTreeMap::new(); - templates.insert("quotes".to_string(), - include_str!("data/templates/quotes.hbs").to_string()); +fn make_renderer() -> HandlebarsEngine { + let mut e = HandlebarsEngine::new(); - e.add(Box::new(MemorySource(templates))); - if let Err(r) = e.reload() { - panic!("Error loading templates: {}", r) - } - e + let mut templates = BTreeMap::new(); + templates.insert( + "quotes".to_string(), + include_str!("data/templates/quotes.hbs").to_string(), + ); + + e.add(Box::new(MemorySource(templates))); + if let Err(r) = e.reload() { + panic!("Error loading templates: {}", r) + } + e } fn info(_r: &mut Request) -> IronResult { - let data = data::make_data(); - Ok(Response::with((status::Ok, - Header(ContentType::html()), - Template::new("quotes", data)))) + let data = data::make_data(); + Ok(Response::with(( + status::Ok, + Header(ContentType::html()), + Template::new("quotes", data), + ))) +} + +fn quotes(r: &mut Request) -> IronResult { + let mut result = Map::new(); + let quotes = { + let mu = r.get::>().unwrap(); + let state = mu.lock().unwrap(); + try!(data::get_quotes(&state.connection)) + }; + result.insert("quotes".to_string(), to_json("es)); + Ok(Response::with(( + status::Ok, + Header(ContentType::html()), + Template::new("quotes", result), + ))) } -pub fn serve(port: u16) { - let router = router!( - info: get "/" => info, +pub fn serve(state: State, port: u16) { + let router = + router!( + info: get "/info" => info, + index: get "/" => quotes, ); let mut chain = Chain::new(router); - chain.link_after(renderer()); + chain.link_after(make_renderer()); + chain.link(Write::::both(state)); let bind_address = format!("{}:{}", "::", port); let _server = Iron::new(chain).http(bind_address.as_str()); info!("Serving on {}", bind_address); -- cgit v1.2.3