Rocket/examples/json/src/main.rs

82 lines
2.1 KiB
Rust
Raw Normal View History

#![feature(plugin, decl_macro)]
2016-10-04 00:56:43 +00:00
#![plugin(rocket_codegen)]
extern crate rocket;
2016-10-04 00:56:43 +00:00
#[macro_use] extern crate rocket_contrib;
#[macro_use] extern crate serde_derive;
#[cfg(test)] mod tests;
use rocket_contrib::{Json, JsonValue};
2017-02-13 10:28:31 +00:00
use rocket::State;
use std::collections::HashMap;
use std::sync::Mutex;
// The type to represent the ID of a message.
type ID = usize;
// We're going to store all of the messages here. No need for a DB.
2017-02-13 10:28:31 +00:00
type MessageMap = Mutex<HashMap<ID, String>>;
#[derive(Serialize, Deserialize)]
struct Message {
id: Option<ID>,
contents: String
}
2017-02-17 02:56:44 +00:00
// TODO: This example can be improved by using `route` with multiple HTTP verbs.
#[post("/<id>", format = "application/json", data = "<message>")]
fn new(id: ID, message: Json<Message>, map: State<MessageMap>) -> JsonValue {
2017-02-13 10:28:31 +00:00
let mut hashmap = map.lock().expect("map lock.");
if hashmap.contains_key(&id) {
json!({
"status": "error",
"reason": "ID exists. Try put."
})
} else {
hashmap.insert(id, message.0.contents);
json!({ "status": "ok" })
}
}
#[put("/<id>", format = "application/json", data = "<message>")]
fn update(id: ID, message: Json<Message>, map: State<MessageMap>) -> Option<JsonValue> {
2017-02-13 10:28:31 +00:00
let mut hashmap = map.lock().unwrap();
if hashmap.contains_key(&id) {
hashmap.insert(id, message.0.contents);
Some(json!({ "status": "ok" }))
} else {
None
}
}
#[get("/<id>", format = "application/json")]
fn get(id: ID, map: State<MessageMap>) -> Option<Json<Message>> {
2017-02-13 10:28:31 +00:00
let hashmap = map.lock().unwrap();
hashmap.get(&id).map(|contents| {
Json(Message {
id: Some(id),
contents: contents.clone()
})
})
}
#[error(404)]
fn not_found() -> JsonValue {
json!({
"status": "error",
"reason": "Resource was not found."
})
}
2017-02-13 10:28:31 +00:00
fn rocket() -> rocket::Rocket {
rocket::ignite()
.mount("/message", routes![new, update, get])
.catch(errors![not_found])
2017-02-13 10:28:31 +00:00
.manage(Mutex::new(HashMap::<ID, String>::new()))
}
fn main() {
rocket().launch();
}