serde-tcod-config-parser 0.1.1

A best-effort implementation of the now deprecated libtcod config file parser functionality from libtcod
use crate::de::{Deserializer, Error};
use crate::lexer::Token;
use serde::de;

pub struct StructSeqAccess<'a, 'de> {
    de: &'a mut Deserializer<'de>,
    type_name: Option<&'de str>,
}

impl<'a, 'de> StructSeqAccess<'a, 'de> {
    pub fn new(de: &'a mut Deserializer<'de>) -> Self {
        Self {
            de,
            type_name: None,
        }
    }
}

impl<'de: 'a, 'a> de::SeqAccess<'de> for StructSeqAccess<'a, 'de> {
    type Error = Error;

    fn next_element_seed<T>(
        &mut self,
        seed: T,
    ) -> Result<Option<<T as de::DeserializeSeed<'de>>::Value>, Self::Error>
    where
        T: de::DeserializeSeed<'de>,
    {
        if self.de.lexer.token == Token::Identifier {
            if let Some(type_name) = self.type_name {
                if type_name != self.de.lexer.slice() {
                    return Ok(None);
                }
            } else {
                self.type_name = Some(self.de.lexer.slice());
            }
            seed.deserialize(&mut *self.de).map(Some)
        } else if self.de.lexer.token == Token::BraceClose {
            Ok(None)
        } else {
            unexpected_token!(self.de.lexer, "<type> <typename> or }")
        }
    }
}