rocket-pinboard/src/main.rs
Paul van Tilburg 167eda78e9 Implement saving a list; make the lists mutable using an RW lock
It currently only saves to memory.  So, if the application restart,
the lists are back to what is in the list files.
2017-12-27 17:36:26 +01:00

76 lines
2.2 KiB
Rust

#![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<Vec<List>>;
#[derive(Serialize)]
struct IndexTemplateContext<'a> {
lists: Vec<HashMap<&'a str, &'a str>>
}
#[get("/")]
fn index(lists: State<ListStore>) -> 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/<list_id>", format = "text/html")]
fn list_show_html(list_id: String, lists: State<ListStore>) -> Option<String> {
let lists = lists.read().unwrap();
let list = lists.iter().find( |list| list.id == list_id )?;
Some(list.to_html())
}
#[get("/lists/<list_id>", format = "application/json")]
fn list_show_json(list_id: String, lists: State<ListStore>) -> Option<Json<List>> {
let lists = lists.read().unwrap();
let list = lists.iter().find( |list| list.id == list_id )?;
Some(Json(list.clone()))
}
#[put("/lists/<list_id>", format = "application/json", data = "<new_list>")]
fn list_update(list_id: String, new_list: Json<List>, lists: State<ListStore>) -> Option<Json<List>> {
let mut lists = lists.write().unwrap();
let list = lists.iter_mut().find( |list| list.id == list_id )?;
list.update_data(&new_list.data);
println!("update list {} with list data {:?}", list_id, 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_show_html, list_show_json, list_update, static_files::all])
.attach(Template::fairing())
}
fn main() {
rocket().launch();
}