From bf7f5d32a7f05bb0a7bc19dcb443d3df439243ba Mon Sep 17 00:00:00 2001 From: Andy Wortman Date: Fri, 27 Oct 2017 01:23:05 -0700 Subject: better error handling in cases where event json changes --- src/tw/events.rs | 122 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 89 insertions(+), 33 deletions(-) (limited to 'src/tw/events.rs') 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) -> Option { - 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) -> Result { + 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) -> 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) -> Result { + 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()) + } } } } -- cgit v1.1