summaryrefslogtreecommitdiff
path: root/src/server.rs
diff options
context:
space:
mode:
authorKjetil Orbekk <kjetil.orbekk@gmail.com>2017-07-09 05:23:03 -0400
committerKjetil Orbekk <kjetil.orbekk@gmail.com>2017-07-09 05:23:03 -0400
commit432d3fce601e9ddc2060519053791f832cb98492 (patch)
tree7045140909aadf388517960b249ea2631974ee91 /src/server.rs
parentda3cfff817b0eaead9be11d945e8f7914c8e801c (diff)
add: Display quotes from sqlite.
Diffstat (limited to 'src/server.rs')
-rw-r--r--src/server.rs79
1 files changed, 57 insertions, 22 deletions
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<Response> {
- 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<Response> {
+ let mut result = Map::new();
+ let quotes = {
+ let mu = r.get::<Write<State>>().unwrap();
+ let state = mu.lock().unwrap();
+ try!(data::get_quotes(&state.connection))
+ };
+ result.insert("quotes".to_string(), to_json(&quotes));
+ 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::<State>::both(state));
let bind_address = format!("{}:{}", "::", port);
let _server = Iron::new(chain).http(bind_address.as_str());
info!("Serving on {}", bind_address);