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 persistent::Write; use handlebars_iron::handlebars::to_json; use serde_json::Map; use params; #[derive(Debug)] pub struct State { pub connection: Connection, } impl iron::typemap::Key for State { type Value = State; } fn make_renderer() -> HandlebarsEngine { let mut e = HandlebarsEngine::new(); 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 quotes(r: &mut Request) -> IronResult { let mut result = Map::new(); let quote_id = { let map = itry!(r.get_ref::()); match map.get("id") { Some(¶ms::Value::String(ref id)) => Some(itry!(id.parse::())), _ => None, } }; let quotes = { let mu = r.get::>().unwrap(); let state = mu.lock().unwrap(); match quote_id { Some(id) => vec!(data::get_quote(&state.connection, id)?), None => 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(state: State, port: u16) { let router = router!( index: get "/" => quotes, view_quote: get "/view_quote" => quotes, ); let mut chain = Chain::new(router); 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); }