remove custom map deserializer
This commit is contained in:
parent
6405c8fa33
commit
ce5b87769c
|
@ -18,6 +18,12 @@ dependencies = [
|
||||||
"time",
|
"time",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "either"
|
||||||
|
version = "1.5.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "envy"
|
name = "envy"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
|
@ -27,6 +33,15 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itertools"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.71"
|
version = "0.2.71"
|
||||||
|
@ -39,6 +54,7 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"envy",
|
"envy",
|
||||||
|
"itertools",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
#itertools = "0.9"
|
itertools = "0.9"
|
||||||
envy = "0.4"
|
envy = "0.4"
|
||||||
chrono = { version = "0.4", features = ["serde"] }
|
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;
|
use std::collections::HashMap;
|
||||||
mod error;
|
mod error;
|
||||||
use error::{Error, MpdResult};
|
use error::{Error, MpdResult};
|
||||||
|
@ -8,31 +8,7 @@ pub use structs::{Position, Track};
|
||||||
/// some unprintable character to separate repeated keys
|
/// some unprintable character to separate repeated keys
|
||||||
const SEPARATOR: char = '\x02';
|
const SEPARATOR: char = '\x02';
|
||||||
|
|
||||||
struct MPDeserializer<'de, Iter: Iterator<Item = (&'de str, &'de str)>> {
|
pub fn deserialize_response<'a, I: Iterator<Item = &'a str>, T: de::DeserializeOwned>(input: I) -> MpdResult<T> {
|
||||||
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> {
|
|
||||||
let mut map: HashMap<String, String> = HashMap::new();
|
let mut map: HashMap<String, String> = HashMap::new();
|
||||||
for line in input {
|
for line in input {
|
||||||
if line.starts_with("OK") {
|
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") {
|
} else if let Some(message) = line.strip_prefix("ACK") {
|
||||||
return Err(Error::from_str(message.trim()));
|
return Err(Error::from_str(message.trim()));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut fields = line.splitn(2, ": ");
|
let mut fields = line.splitn(2, ": ");
|
||||||
match (fields.next(), fields.next()) {
|
match (fields.next(), fields.next()) {
|
||||||
(Some(k), Some(v)) => {
|
(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),
|
_ => panic!("invalid response line: {:?}", line),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(envy::from_iter(map).unwrap())
|
|
||||||
// Eventually, I’d like to use my own deserializer instead of envy
|
// Eventually, I’d like to use my own deserializer instead of envy
|
||||||
// let deser = MPDeserializer {
|
Ok(envy::from_iter(map).unwrap())
|
||||||
// inner: MapDeserializer::new(map.into_iter()),
|
|
||||||
// };
|
|
||||||
// Song::deserialize(deser)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user