From 4554b2a4533181886446985c9858f1e49deb4670 Mon Sep 17 00:00:00 2001 From: David Li Date: Sat, 31 Oct 2015 17:58:55 -0400 Subject: Restructure modules --- src/message/mod.rs | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/message/mod.rs (limited to 'src/message') diff --git a/src/message/mod.rs b/src/message/mod.rs new file mode 100644 index 0000000..0617c4d --- /dev/null +++ b/src/message/mod.rs @@ -0,0 +1,103 @@ +extern crate rustc_serialize; + +use self::rustc_serialize::{json, Decodable, Decoder}; + +#[derive(Debug)] +pub enum Push { + Mirror { + notification_id: i32, + title: String, + body: String, + application_name: String, + package_name: String, + icon: String + }, + Dismissal { + notification_id: i32 + } +} + +#[derive(Debug)] +pub enum Message { + Nop, + Push(Push) +} + +impl Message { + pub fn parse(message: &str) -> Option { + let json = json::Json::from_str(message).unwrap(); + let mut decoder = json::Decoder::new(json); + let result : Result = Decodable::decode(&mut decoder); + result.ok() + } +} + +impl Decodable for Push { + fn decode(d: &mut D) -> Result { + d.read_struct("root", 0, |d| { + let type_ : String = try!(d.read_struct_field("type", 0, Decodable::decode)); + match type_.as_ref() { + "mirror" => { + let id = try!( + d.read_struct_field("notification_id", 0, Decodable::decode)); + let title = try!( + d.read_struct_field("title", 0, Decodable::decode)); + let body = try!( + d.read_struct_field("body", 0, Decodable::decode)); + let app_name = try!( + d.read_struct_field("application_name", 0, Decodable::decode)); + let package_name = try!( + d.read_struct_field("package_name", 0, Decodable::decode)); + let icon = try!( + d.read_struct_field("icon", 0, Decodable::decode)); + + Ok(Push::Mirror { + title: title, + body: body, + application_name: app_name, + package_name: package_name, + notification_id: id, + icon: icon + }) + } + "dismissal" => { + let id = try!( + d.read_struct_field("notification_id", 0, Decodable::decode)); + + Ok(Push::Dismissal { + notification_id: id + }) + } + _ => { + let err_msg = format!( + "Invalid value for push type: {} (expected 'mirror' or 'dismissal')", + type_); + Err(d.error(err_msg.as_ref())) + } + } + }) + } +} + +impl Decodable for Message { + fn decode(d: &mut D) -> Result { + d.read_struct("root", 0, |d| { + let type_ : String = try!(d.read_struct_field("type", 0, Decodable::decode)); + + match type_.as_ref() { + "nop" => Ok(Message::Nop), + "push" => { + d.read_struct_field("push", 0, |d| { + Ok(Message::Push(try!(Decodable::decode(d)))) + }) + }, + _ => { + let err_msg = format!( + "Invalid value for message type: {}", + type_); + Err(d.error(err_msg.as_ref())) + } + } + }) + } +} -- cgit v1.2.3