remove custom map deserializer

This commit is contained in:
kageru 2020-06-21 14:20:35 +02:00
parent 6405c8fa33
commit ce5b87769c
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
3 changed files with 21 additions and 32 deletions

16
Cargo.lock generated
View File

@ -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",
]

View File

@ -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"] }

View File

@ -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<Item = (&'de str, &'de str)>> {
inner: MapDeserializer<'de, Iter, Error>,
}
impl<'de, Iter: Iterator<Item = (&'de str, &'de str)>> de::Deserializer<'de> for MPDeserializer<'de, Iter> {
type Error = Error;
fn deserialize_any<V>(self, visitor: V) -> MpdResult<V::Value>
where V: de::Visitor<'de> {
self.deserialize_map(visitor)
}
fn deserialize_map<V>(self, visitor: V) -> MpdResult<V::Value>
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<Item = &'a str>, T: de::DeserializeOwned>(input: I) -> Result<T, Error> {
pub fn deserialize_response<'a, I: Iterator<Item = &'a str>, T: de::DeserializeOwned>(input: I) -> MpdResult<T> {
let mut map: HashMap<String, String> = HashMap::new();
for line in input {
if line.starts_with("OK") {
@ -40,6 +16,7 @@ pub fn deserialize_response<'a, I: Iterator<Item = &'a str>, 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<Item = &'a str>, 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)]