diff --git a/src/mpvctl/mpvctl.rs b/src/mpvctl/mpvctl.rs index e5d70b1..4512373 100644 --- a/src/mpvctl/mpvctl.rs +++ b/src/mpvctl/mpvctl.rs @@ -88,75 +88,70 @@ impl MpvCtl { db: &CommandDb, event_listeners: &EventDb, ) -> Result<(), Box> { - match framed_read.read_frame().await { - Ok(Some(frame)) => { - println!("Read {}", frame); - // check if its an event - let is_event = match &frame { - serde_json::Value::Object(obj) => obj.contains_key("event"), - _ => false, + let current_frame = framed_read.read_frame().await.map_err(|e| e.to_string())?; + if let Some(frame) = current_frame { + println!("Read {}", frame); + // check if its an event + let is_event = match &frame { + serde_json::Value::Object(obj) => obj.contains_key("event"), + _ => false, + }; + if is_event { + let obj = match &frame { + serde_json::Value::Object(obj) => obj, + _ => { + return Err("Got back a json value that wasn't an object.".into()); + } }; - if is_event { - let obj = match &frame { - serde_json::Value::Object(obj) => obj, - _ => { - return Err("Got back a json value that wasn't an object.".into()); - } - }; - match obj.get("event") { - Some(orig @ serde_json::Value::String(s)) => { - println!("Notifying listeners for event {}", s); - let listeners = { - let db_handle = event_listeners.lock().unwrap(); - match (*db_handle).get(s) { - None => Vec::new(), - Some(listeners) => listeners.to_owned(), - } - }; - for listener in listeners { - listener.send(frame.clone()).await; + match obj.get("event") { + Some(serde_json::Value::String(s)) => { + println!("Notifying listeners for event {}", s); + let listeners = { + let db_handle = event_listeners.lock().unwrap(); + match (*db_handle).get(s) { + None => Vec::new(), + Some(listeners) => listeners.to_owned(), } - } - _ => return Err("Event with no string value".into()), - }; - return Ok(()); - } - // get the request id and push the result into the channel - let reqid = { - let obj = match &frame { - serde_json::Value::Object(obj) => obj, - _ => { - return Err("Got back a json value that wasn't an object.".into()); - } - }; - match obj.get("request_id") { - Some(serde_json::Value::Number(reqid)) if reqid.is_u64() => { - reqid.as_u64().unwrap() - } - _ => { - return Err("Unrecognized request_id".into()); + }; + for listener in listeners { + listener.send(frame.clone()).await?; } } + _ => return Err("Event with no string value".into()), }; - - { - let mut db_handle = db.lock().unwrap(); - if let Entry::Occupied(o) = (*db_handle).entry(reqid) { - o.remove() - .send(frame) - .map_err(|e| "Failed to send frame".to_string())?; - } else { - return Err("No entry found for request id".into()); - } - } - } - Ok(None) => { return Ok(()); } - Err(e) => { - return Err("Ran into a problem".into()); + // get the request id and push the result into the channel + let reqid = { + let obj = match &frame { + serde_json::Value::Object(obj) => obj, + _ => { + return Err("Got back a json value that wasn't an object.".into()); + } + }; + match obj.get("request_id") { + Some(serde_json::Value::Number(reqid)) if reqid.is_u64() => { + reqid.as_u64().unwrap() + } + _ => { + return Err("Unrecognized request_id".into()); + } + } + }; + + { + let mut db_handle = db.lock().unwrap(); + if let Entry::Occupied(o) = (*db_handle).entry(reqid) { + o.remove() + .send(frame) + .map_err(|e| "Failed to send frame".to_string())?; + } else { + return Err("No entry found for request id".into()); + } } - } + } else if let None = current_frame { + return Ok(()); + }; Ok(()) }