aboutsummaryrefslogtreecommitdiff
path: root/src/tw/events.rs
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2017-10-27 01:23:05 -0700
committeriximeow <me@iximeow.net>2017-10-27 01:23:05 -0700
commitc40aa2bf95131317e2a9b199afd0b34ae2d847ee (patch)
treef3123c3678085ca6bb9a679272e02efe0e427fff /src/tw/events.rs
parent4a8d9db54cff6b45cb44712d851de0cbb3da37bf (diff)
better error handling in cases where event json changes
Diffstat (limited to 'src/tw/events.rs')
-rw-r--r--src/tw/events.rs122
1 files changed, 89 insertions, 33 deletions
diff --git a/src/tw/events.rs b/src/tw/events.rs
index afc7fbb..35167a3 100644
--- a/src/tw/events.rs
+++ b/src/tw/events.rs
@@ -13,39 +13,95 @@ pub enum Event {
}
impl Event {
- pub fn from_json(structure: serde_json::Map<String, serde_json::Value>) -> Option<Event> {
- match &structure["event"].as_str().unwrap() {
- &"follow" => Some(Event::Followed {
- user_id: structure["source"]["id_str"].as_str().unwrap().to_owned()
- }),
- &"unfollow" => Some(Event::Unfollowed {
- user_id: structure["source"]["id_str"].as_str().unwrap().to_owned()
- }),
- &"favorite" => Some(Event::Fav {
- user_id: structure["source"]["id_str"].as_str().unwrap().to_owned(),
- twete_id: structure["target_object"]["id_str"].as_str().unwrap().to_owned()
- }),
- &"unfavorite" => Some(Event::Unfav {
- user_id: structure["source"]["id_str"].as_str().unwrap().to_owned(),
- twete_id: structure["target_object"]["id_str"].as_str().unwrap().to_owned()
- }),
- &"favorited_retweet" => Some(Event::Fav_RT {
- user_id: structure["source"]["id_str"].as_str().unwrap().to_owned(),
- twete_id: structure["target_object"]["id_str"].as_str().unwrap().to_owned()
- }),
- &"retweeted_retweet" => Some(Event::RT_RT {
- user_id: structure["source"]["id_str"].as_str().unwrap().to_owned(),
- twete_id: structure["target_object"]["id_str"].as_str().unwrap().to_owned()
- }),
- &"quoted_tweet" => Some(Event::Quoted {
- user_id: structure["source"]["id_str"].as_str().unwrap().to_owned(),
- twete_id: structure["target_object"]["id_str"].as_str().unwrap().to_owned()
- }),
-// &"list_member_added" =>
-// what about removed?
-// &"blocked" => Blocked { },
-// &"unblocked" => Unblocked { },
- e => { println!("unrecognized event: {}", e); None }
+ fn get_source_id(structure: serde_json::Map<String, serde_json::Value>) -> Result<String, String> {
+ match structure.get("source").and_then(|x| x.get("id_str").and_then(|x| x.as_str())) {
+ Some(id) => Ok(id.to_string()),
+ None => Err("No id_str string at .source.id_str".to_string())
+ }
+ }
+ fn get_source_target_ids(structure: serde_json::Map<String, serde_json::Value>) -> Result<(String, String), String> {
+ match (
+ structure.get("source").and_then(|x| x.get("id_str").and_then(|x| x.as_str())),
+ structure.get("target_obj").and_then(|x| x.get("id_str").and_then(|x| x.as_str()))
+ ) {
+ (Some(source_id), Some(target_id)) => Ok((source_id.to_string(), target_id.to_string())),
+ (None, Some(target_id)) => Err("No id_str string at .source.id_str".to_string()),
+ (Some(target_id), None) => Err("No id_str string at .target_object.id_str".to_string()),
+ (None, None) => Err("No id_str at source or target_object".to_string())
+ }
+ }
+ // maybe type error
+ // better? string is ok
+ // for now..
+ pub fn from_json(structure: serde_json::Map<String, serde_json::Value>) -> Result<Event, String> {
+ match structure.get("event").and_then(|x| x.as_str()).map(|x| x.to_owned()) {
+ Some(event) => {
+ let event_ref: &str = &event;
+ match event_ref {
+ "follow" =>
+ Event::get_source_id(structure)
+ .map(|id_str|
+ Event::Followed {
+ user_id: id_str
+ }
+ ),
+ "unfollow" =>
+ Event::get_source_id(structure)
+ .map(|id_str|
+ Event::Unfollowed {
+ user_id: id_str
+ }
+ ),
+ "favorite" =>
+ Event::get_source_target_ids(structure)
+ .map(|(source_id, target_id)|
+ Event::Fav {
+ user_id: source_id,
+ twete_id: target_id
+ }
+ ),
+ "unfavorite" =>
+ Event::get_source_target_ids(structure)
+ .map(|(source_id, target_id)|
+ Event::Unfav {
+ user_id: source_id,
+ twete_id: target_id
+ }
+ ),
+ "favorited_retweet" =>
+ Event::get_source_target_ids(structure)
+ .map(|(source_id, target_id)|
+ Event::Fav_RT {
+ user_id: source_id,
+ twete_id: target_id
+ }
+ ),
+ "retweeted_retweet" =>
+ Event::get_source_target_ids(structure)
+ .map(|(source_id, target_id)|
+ Event::RT_RT {
+ user_id: source_id,
+ twete_id: target_id
+ }
+ ),
+ "quoted_tweet" =>
+ Event::get_source_target_ids(structure)
+ .map(|(source_id, target_id)|
+ Event::Quoted {
+ user_id: source_id,
+ twete_id: target_id
+ }
+ ),
+ // "list_member_added" =>
+ // what about removed?
+ // "blocked" => Blocked { },
+ // "unblocked" => Unblocked { },
+ e => { println!("unrecognized event: {}", e); Err(e.to_string()) }
+ }
+ },
+ None => {
+ Err("No event in event json...".to_string())
+ }
}
}
}