use serde::Deserialize;
use serde::de::{
self, DeserializeSeed, EnumAccess, IntoDeserializer, MapAccess, SeqAccess,
VariantAccess, Visitor,
};
use serde::forward_to_deserialize_any;
use core::result::Result as CoreResult;
use crate::parse::parse_document;
use crate::elements::*;
pub struct Deserializer<'de> {
input: Result<DatDocument<'de>>
}
impl<'de> Deserializer<'de> {
pub fn from_str(input: &'de str) -> Self {
Deserializer { input: parse_document(input) }
}
}
pub fn from_str<'a, T>(s: &'a str) -> Result<T>
where
T: Deserialize<'a>,
{
let mut deserializer = Deserializer::from_str(s);
let t = T::deserialize(&mut deserializer)?;
Ok(t)
}
type Result<T> = CoreResult<T, crate::Error>;
#[derive(Debug, Deserialize)]
struct test {
name: String,
}
#[test]
fn test_serde() {
const TEST :&str = r#"clrmamepro ( name "Hello World" )"#;
let x = from_str::<test>(TEST);
println!("{:?}", x);
}
impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
type Error = crate::Error;
fn deserialize_struct<V: de::Visitor<'de>>(
self,
_name: &'static str,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value> {
println!("{}, {:?}", _name, fields);
let map = serde::de::map::MapAccess::new(self, e)?;
panic!()
}
fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
panic!()
}
forward_to_deserialize_any! {
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
bytes byte_buf option unit unit_struct newtype_struct seq tuple
tuple_struct map enum identifier ignored_any
}
}