From 1e39119e097c1a6f81c70ce5088ebbf6adeda7cb Mon Sep 17 00:00:00 2001 From: kageru Date: Sun, 21 Jun 2020 23:37:19 +0200 Subject: [PATCH] Generify reponse chunking --- src/lib.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cbb5032..463c5ab 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,7 +9,7 @@ pub use structs::{Position, State, Stats, Status, Track, UnitResponse}; /// some unprintable character to separate repeated keys const SEPARATOR: char = '\x02'; -pub fn deserialize_response<'a, I: Iterator, T: de::DeserializeOwned>(input: I) -> MpdResult { +pub fn parse_response<'a, I: Iterator, T: de::DeserializeOwned>(input: I) -> MpdResult { let mut map: HashMap = HashMap::new(); for line in input { if line.starts_with("OK") { @@ -34,7 +34,7 @@ pub fn deserialize_response<'a, I: Iterator, T: de::DeserializeO Ok(envy::from_iter(map).unwrap()) } -pub fn read_playlist_info<'a, I: Iterator>(input: I) -> MpdResult> { +pub fn parse_response_vec<'a, 'b, I: Iterator, T: de::DeserializeOwned>(input: I, first_key: &'b str) -> MpdResult> { input .peekable() .batching(|it| { @@ -48,7 +48,7 @@ pub fn read_playlist_info<'a, I: Iterator>(input: I) -> MpdResul }; // Only peek here in case we encounter the `file:` line which we still need for the next track. while let Some(l) = it.peek() { - if l.starts_with("file:") { + if l.starts_with(first_key) { return Some(v); } if l.starts_with("OK") { @@ -58,7 +58,7 @@ pub fn read_playlist_info<'a, I: Iterator>(input: I) -> MpdResul } None }) - .map(|b| deserialize_response(b.into_iter())) + .map(|b| parse_response(b.into_iter())) .collect() } @@ -83,7 +83,7 @@ duration: 512.380 Pos: 1367 Id: 1368 OK"; - let t: Track = deserialize_response(input_str.lines()).unwrap(); + let t: Track = parse_response(input_str.lines()).unwrap(); assert_eq!( t, Track { @@ -135,7 +135,7 @@ Performer: Jane Glover Pos: 3439 Id: 3440 OK"#; - let t: Track = deserialize_response(input_str.lines()).unwrap(); + let t: Track = parse_response(input_str.lines()).unwrap(); assert_eq!( t, Track { @@ -192,7 +192,7 @@ audio: 44100:16:2 nextsong: 4036 nextsongid: 4037 OK"; - let s: Status = deserialize_response(input_str.lines()).unwrap(); + let s: Status = parse_response(input_str.lines()).unwrap(); assert_eq!( s, Status { @@ -241,7 +241,7 @@ duration: 50.155 Pos: 1002 Id: 6367 OK"; - let queue = read_playlist_info(input_str.lines()); + let queue = parse_response_vec(input_str.lines(), "file:"); let first_track = Track { file: "137 A New World.mp3".into(), title: Some("A New World".into()), @@ -276,8 +276,8 @@ OK"; ]) ); - let queue = read_playlist_info("OK".lines()); - assert_eq!(queue, Ok(vec![])); + let queue = parse_response_vec("OK".lines(), "file:"); + assert_eq!(queue, Ok(Vec::::new())); } #[test] @@ -290,7 +290,7 @@ songs: 40322 db_playtime: 11620284 db_update: 1588433046 OK"; - let s: Stats = deserialize_response(input_str.lines()).unwrap(); + let s: Stats = parse_response(input_str.lines()).unwrap(); assert_eq!( s, Stats { @@ -308,11 +308,11 @@ OK"; #[test] fn de_unit_response_test() { let success = "OK"; - let r: Result = deserialize_response(success.lines()); + let r: Result = parse_response(success.lines()); assert_eq!(r, Ok(UnitResponse {})); let failure = r#"ACK [2@0] {consume} wrong number of arguments for "consume""#; - let r: Result = deserialize_response(failure.lines()); + let r: Result = parse_response(failure.lines()); assert_eq!( r, Err(error::Error::from_str(r#"[2@0] {consume} wrong number of arguments for "consume""#))