#![feature(plugin)] #![plugin(rocket_codegen)] extern crate comrak; extern crate glob; extern crate inflector; extern crate rocket; extern crate rocket_contrib; #[macro_use] extern crate serde_derive; extern crate serde_json; mod list; mod static_files; use list::List; use rocket::{Rocket, State}; use rocket_contrib::{Json, Template}; use std::collections::HashMap; use std::sync::RwLock; type ListStore = RwLock>; #[derive(Serialize)] struct IndexTemplateContext<'a> { lists: Vec> } #[get("/")] fn index(lists: State) -> Template { let lists = lists.read().unwrap(); let mut list_kvs = vec![]; for list in lists.iter() { let mut list_kv = HashMap::new(); list_kv.insert("id", list.id.as_ref()); list_kv.insert("name", list.name.as_ref()); list_kvs.push(list_kv); } let context = IndexTemplateContext { lists: list_kvs }; Template::render("index", &context) } #[get("/lists", format = "application/json")] fn list_index(lists: State) -> Option>> { let lists = lists.read().unwrap(); Some(Json(lists.clone())) } #[get("/lists/", format = "text/html")] fn list_show_html(list_id: String, lists: State) -> Option { let lists = lists.read().unwrap(); let list = lists.iter().find( |list| list.id == list_id )?; Some(list.to_html()) } #[get("/lists/", format = "application/json")] fn list_show_json(list_id: String, lists: State) -> Option> { let lists = lists.read().unwrap(); let list = lists.iter().find( |list| list.id == list_id )?; Some(Json(list.clone())) } #[put("/lists/", format = "application/json", data = "")] fn list_update(list_id: String, new_list: Json, lists: State) -> Option> { let mut lists = lists.write().unwrap(); let list = lists.iter_mut().find( |list| list.id == list_id )?; list.update_data(&new_list.data); Some(Json(list.clone())) } fn rocket() -> Rocket { let lists = list::List::load_all(); rocket::ignite() .manage(RwLock::new(lists)) .mount("/", routes![index, list_index, list_show_html, list_show_json, list_update, static_files::all]) .attach(Template::fairing()) } fn main() { rocket().launch(); }