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/main.rs | 106 ++++++++------------------------------------------ src/message.rs | 103 ------------------------------------------------ src/message/mod.rs | 103 ++++++++++++++++++++++++++++++++++++++++++++++++ src/pushbullet/mod.rs | 54 +++++++++++++++++++++++++ 4 files changed, 174 insertions(+), 192 deletions(-) delete mode 100644 src/message.rs create mode 100644 src/message/mod.rs create mode 100644 src/pushbullet/mod.rs diff --git a/src/main.rs b/src/main.rs index b12f5a6..7570dcb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,63 +3,13 @@ use std::io::prelude::*; extern crate notify_rust; extern crate toml; -extern crate websocket; -extern crate rustc_serialize; use notify_rust::Notification; -mod message; +pub mod message; use message::{Message, Push}; -use websocket::Sender; -use websocket::Receiver; -use websocket::WebSocketStream; -use websocket::DataFrame; -use websocket::Client; - -struct PBClient { - client: websocket::client::Client, - websocket::client::receiver::Receiver> -} - -impl PBClient { - fn new(token: &str) -> PBClient { - use websocket::client::request::Url; - use websocket::Client; - - let wss_url = format!("wss://stream.pushbullet.com/websocket/{}", token); - let url = Url::parse(wss_url.as_ref()).unwrap(); - let request = Client::connect(url).unwrap(); - let response = request.send().unwrap(); - response.validate().unwrap(); - - PBClient { - client: response.begin() - } - } - - fn process_message(message: Result) -> Option { - let message = match message { - Ok(m) => m, - Err(e) => { - println!("Error: {:?}", e); - return None; - } - }; - - if let websocket::Message::Text(message) = message { - Message::parse(message.as_ref()) - } - else { - None - } - } - - fn messages<'a>(&'a mut self) -> Box + 'a> { - let mut receiver = self.client.get_mut_reciever(); // there is a typo in the API - Box::new(receiver.incoming_messages().filter_map(PBClient::process_message)) - } -} +pub mod pushbullet; +use pushbullet::PBClient; fn main() { let mut cfg_file = File::open("config.toml").expect("Could not find config.toml."); @@ -76,45 +26,23 @@ fn main() { .expect("'token' should be a string"); let mut client = PBClient::new(token.as_ref()); - let mut receiver = client.client.get_mut_reciever(); - - for message in receiver.incoming_messages() { - let message = match message { - Ok(m) => m, - Err(e) => { - println!("Error: {:?}", e); - return; - } - }; + for message in client.messages() { match message { - websocket::Message::Close(_) => { - return; - } - websocket::Message::Text(message) => { - let msg = Message::parse(message.as_ref()); - if let Some(msg) = msg { - match msg { - Message::Push(Push::Mirror { - title, - body, - application_name, - .. - }) => { - let title = format!("{}: {}", application_name, title); - Notification::new() - .body(body.as_ref()) - .summary(title.as_ref()) - .show() - .unwrap(); - } - _ => {} - } - } - } - _ => { - println!("Got {:?}", message); + Message::Push(Push::Mirror { + title, + body, + application_name, + .. + }) => { + let title = format!("{}: {}", application_name, title); + Notification::new() + .body(body.as_ref()) + .summary(title.as_ref()) + .show() + .unwrap(); } + _ => {} } } } diff --git a/src/message.rs b/src/message.rs deleted file mode 100644 index 0617c4d..0000000 --- a/src/message.rs +++ /dev/null @@ -1,103 +0,0 @@ -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())) - } - } - }) - } -} 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())) + } + } + }) + } +} diff --git a/src/pushbullet/mod.rs b/src/pushbullet/mod.rs new file mode 100644 index 0000000..1f2254e --- /dev/null +++ b/src/pushbullet/mod.rs @@ -0,0 +1,54 @@ +extern crate websocket; +extern crate rustc_serialize; + +use message::Message; + +use self::websocket::Sender; +use self::websocket::Receiver; +use self::websocket::WebSocketStream; +use self::websocket::DataFrame; +use self::websocket::Client; +use self::websocket::client::request::Url; + +pub struct PBClient { + client: websocket::client::Client, + websocket::client::receiver::Receiver> +} + +impl PBClient { + pub fn new(token: &str) -> PBClient { + + let wss_url = format!("wss://stream.pushbullet.com/websocket/{}", token); + let url = Url::parse(wss_url.as_ref()).unwrap(); + let request = Client::connect(url).unwrap(); + let response = request.send().unwrap(); + response.validate().unwrap(); + + PBClient { + client: response.begin() + } + } + + fn process_message(message: Result) -> Option { + let message = match message { + Ok(m) => m, + Err(e) => { + println!("Error: {:?}", e); + return None; + } + }; + + if let websocket::Message::Text(message) = message { + Message::parse(message.as_ref()) + } + else { + None + } + } + + pub fn messages<'a>(&'a mut self) -> Box + 'a> { + let mut receiver = self.client.get_mut_reciever(); // there is a typo in the API + Box::new(receiver.incoming_messages().filter_map(PBClient::process_message)) + } +} -- cgit v1.2.3