2020-06-13 09:18:47 +02:00
#[ macro_use ]
extern crate pest_derive ;
use pest ::Parser ;
use serde ::de ;
use serde ::de ::value ::MapDeserializer ;
use serde ::forward_to_deserialize_any ;
use serde ::Deserialize ;
mod error ;
use error ::MpdResult ;
#[ derive(Parser) ]
#[ grammar = " response.pest " ]
struct MpdParser ;
2020-06-13 09:44:26 +02:00
struct MPDeserializer < ' de , Iter : Iterator < Item = ( & ' de str , & ' de str ) > > {
2020-06-13 09:18:47 +02:00
inner : MapDeserializer < ' de , Iter , error ::Error > ,
}
2020-06-13 09:44:26 +02:00
impl < ' de , Iter : Iterator < Item = ( & ' de str , & ' de str ) > > de ::Deserializer < ' de >
2020-06-13 09:18:47 +02:00
for MPDeserializer < ' de , Iter >
{
type Error = 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
}
}
#[ derive(Debug, Deserialize) ]
2020-06-13 09:44:26 +02:00
#[ serde(rename_all = " PascalCase " ) ]
2020-06-13 09:18:47 +02:00
struct Song {
2020-06-13 09:44:26 +02:00
title : String ,
artist : String ,
2020-06-13 09:18:47 +02:00
}
fn main ( ) {
/*
let parsed = MpdParser ::parse ( Rule ::response , input )
. expect ( " invalid response " )
. next ( )
. unwrap ( ) ;
let last = parsed . into_inner ( ) . last ( ) . unwrap ( ) ;
match last . as_rule ( ) {
Rule ::ok = > println! ( " response was ok " ) ,
Rule ::err = > println! ( " response was an error " ) ,
_ = > unreachable! ( " Last response line should always be a status " ) ,
}
let mut deser = MPDeserializer ::from_str (
" Title: A song 星
Artist : A name
OK mpd 0.2 1.23 " ,
)
. expect ( " broken deser " ) ;
let d = Song ::deserialize ( & mut deser ) ;
println! ( " {:?} " , d ) ;
* /
2020-06-13 09:44:26 +02:00
let input_var : & str = " Title: A song 星
Artist : A name
OK mpd 0.2 1.23 " ;
2020-06-13 09:18:47 +02:00
let mut map = std ::collections ::HashMap ::new ( ) ;
let parser = MpdParser ::parse ( Rule ::response , input_var )
. unwrap ( )
. next ( )
. unwrap ( ) ;
2020-06-13 09:44:26 +02:00
for line in parser . into_inner ( ) {
match line . as_rule ( ) {
2020-06-13 09:18:47 +02:00
Rule ::kv = > {
2020-06-13 09:44:26 +02:00
let mut fields = line . into_inner ( ) ;
2020-06-13 09:18:47 +02:00
map . insert (
2020-06-13 09:44:26 +02:00
fields . next ( ) . unwrap ( ) . as_str ( ) ,
fields . next ( ) . unwrap ( ) . as_str ( ) ,
2020-06-13 09:18:47 +02:00
) ;
}
2020-06-13 09:44:26 +02:00
Rule ::ok = > break ,
2020-06-13 09:18:47 +02:00
Rule ::err = > panic! ( " received error response " ) ,
_ = > unreachable! ( ) ,
}
}
dbg! ( & map ) ;
let deser = MPDeserializer {
2020-06-13 09:44:26 +02:00
inner : MapDeserializer ::new ( map . into_iter ( ) ) ,
2020-06-13 09:18:47 +02:00
} ;
let s = Song ::deserialize ( deser ) ;
println! ( " {:?} " , s ) ;
}