some cleanup

This commit is contained in:
kageru 2020-06-13 09:44:26 +02:00
parent 7bceb3afc8
commit 117d552939
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2

View File

@ -1,10 +1,8 @@
#[macro_use] #[macro_use]
extern crate pest_derive; extern crate pest_derive;
use pest::iterators::Pair;
use pest::Parser; use pest::Parser;
use serde::de; use serde::de;
use serde::de::value::MapDeserializer; use serde::de::value::MapDeserializer;
use serde::de::DeserializeOwned;
use serde::forward_to_deserialize_any; use serde::forward_to_deserialize_any;
use serde::Deserialize; use serde::Deserialize;
mod error; mod error;
@ -14,11 +12,11 @@ use error::MpdResult;
#[grammar = "response.pest"] #[grammar = "response.pest"]
struct MpdParser; struct MpdParser;
struct MPDeserializer<'de, Iter: Iterator<Item = (String, String)>> { struct MPDeserializer<'de, Iter: Iterator<Item = (&'de str, &'de str)>> {
inner: MapDeserializer<'de, Iter, error::Error>, inner: MapDeserializer<'de, Iter, error::Error>,
} }
impl<'de, Iter: Iterator<Item = (String, String)>> de::Deserializer<'de> impl<'de, Iter: Iterator<Item = (&'de str, &'de str)>> de::Deserializer<'de>
for MPDeserializer<'de, Iter> for MPDeserializer<'de, Iter>
{ {
type Error = error::Error; type Error = error::Error;
@ -45,15 +43,12 @@ impl<'de, Iter: Iterator<Item = (String, String)>> de::Deserializer<'de>
} }
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
struct Song { struct Song {
Title: String, title: String,
Artist: String, artist: String,
} }
const input_var: &str = "Title: A song 星
Artist: A name
OK mpd 0.21.23";
fn main() { fn main() {
/* /*
let parsed = MpdParser::parse(Rule::response, input) let parsed = MpdParser::parse(Rule::response, input)
@ -75,30 +70,32 @@ fn main() {
let d = Song::deserialize(&mut deser); let d = Song::deserialize(&mut deser);
println!("{:?}", d); println!("{:?}", d);
*/ */
let input_var: &str = "Title: A song 星
Artist: A name
OK mpd 0.21.23";
let mut map = std::collections::HashMap::new(); let mut map = std::collections::HashMap::new();
let parser = MpdParser::parse(Rule::response, input_var) let parser = MpdParser::parse(Rule::response, input_var)
.unwrap() .unwrap()
.next() .next()
.unwrap(); .unwrap();
for pair in parser.into_inner() { for line in parser.into_inner() {
let rule = pair.as_rule(); match line.as_rule() {
match rule {
Rule::kv => { Rule::kv => {
let mut fields = pair.into_inner(); let mut fields = line.into_inner();
map.insert( map.insert(
fields.next().unwrap().as_str().to_string(), fields.next().unwrap().as_str(),
fields.next().unwrap().as_str().to_string(), fields.next().unwrap().as_str(),
); );
} }
Rule::ok => (), Rule::ok => break,
Rule::err => panic!("received error response"), Rule::err => panic!("received error response"),
_ => unreachable!(), _ => unreachable!(),
} }
} }
// ::<'_, _, Song>
dbg!(&map); dbg!(&map);
let deser = MPDeserializer { let deser = MPDeserializer {
inner: serde::de::value::MapDeserializer::new(map.into_iter()), inner: MapDeserializer::new(map.into_iter()),
}; };
let s = Song::deserialize(deser); let s = Song::deserialize(deser);
println!("{:?}", s); println!("{:?}", s);