listinfo 0.1.0

Parser for MAME ListInfo DAT files.
Documentation
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> {
    // By convention, `Deserializer` constructors are named like `from_xyz`.
    // That way basic use cases are satisfied by something like
    // `serde_json::from_str(...)` while advanced use cases that require a
    // deserializer can make one with `serde_json::Deserializer::from_str(...)`.
    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
    }
}