diff --git a/Cargo.lock b/Cargo.lock index 0b03d15..d769633 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,6 +18,12 @@ dependencies = [ "time", ] +[[package]] +name = "either" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" + [[package]] name = "envy" version = "0.4.1" @@ -27,6 +33,15 @@ dependencies = [ "serde", ] +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + [[package]] name = "libc" version = "0.2.71" @@ -39,6 +54,7 @@ version = "0.1.0" dependencies = [ "chrono", "envy", + "itertools", "serde", ] diff --git a/Cargo.toml b/Cargo.toml index 2805262..3173096 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] serde = { version = "1.0", features = ["derive"] } -#itertools = "0.9" +itertools = "0.9" envy = "0.4" chrono = { version = "0.4", features = ["serde"] } diff --git a/src/lib.rs b/src/lib.rs index 1b7acb2..bc0728d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -use serde::{de, de::value::MapDeserializer, forward_to_deserialize_any}; +use serde::de; use std::collections::HashMap; mod error; use error::{Error, MpdResult}; @@ -8,31 +8,7 @@ pub use structs::{Position, Track}; /// some unprintable character to separate repeated keys const SEPARATOR: char = '\x02'; -struct MPDeserializer<'de, Iter: Iterator> { - inner: MapDeserializer<'de, Iter, Error>, -} - -impl<'de, Iter: Iterator> de::Deserializer<'de> for MPDeserializer<'de, Iter> { - type Error = Error; - - fn deserialize_any(self, visitor: V) -> MpdResult - where V: de::Visitor<'de> { - self.deserialize_map(visitor) - } - - fn deserialize_map(self, visitor: V) -> MpdResult - where V: de::Visitor<'de> { - visitor.visit_map(self.inner) - } - - forward_to_deserialize_any! { - bool char str string bytes byte_buf unit unit_struct seq - tuple tuple_struct struct identifier ignored_any - i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 option newtype_struct enum - } -} - -pub fn deserialize_response<'a, I: Iterator, T: de::DeserializeOwned>(input: I) -> Result { +pub fn deserialize_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") { @@ -40,6 +16,7 @@ pub fn deserialize_response<'a, I: Iterator, T: de::DeserializeO } else if let Some(message) = line.strip_prefix("ACK") { return Err(Error::from_str(message.trim())); } + let mut fields = line.splitn(2, ": "); match (fields.next(), fields.next()) { (Some(k), Some(v)) => { @@ -53,12 +30,8 @@ pub fn deserialize_response<'a, I: Iterator, T: de::DeserializeO _ => panic!("invalid response line: {:?}", line), } } - Ok(envy::from_iter(map).unwrap()) // Eventually, I’d like to use my own deserializer instead of envy - // let deser = MPDeserializer { - // inner: MapDeserializer::new(map.into_iter()), - // }; - // Song::deserialize(deser) + Ok(envy::from_iter(map).unwrap()) } #[cfg(test)]