Paul van Tilburg
167eda78e9
It currently only saves to memory. So, if the application restart, the lists are back to what is in the list files.
75 lines
2.2 KiB
Rust
75 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();
|
|
}
|