remove custom map deserializer
This commit is contained in:
parent
6405c8fa33
commit
ce5b87769c
|
@ -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",
|
||||
]
|
||||
|
||||
|
|
|
@ -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"] }
|
||||
|
||||
|
|
35
src/lib.rs
35
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<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)]
|
||||
|
|
Loading…
Reference in New Issue
Block a user