serde-tcod-config-parser 0.1.1

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

pub struct PrimitiveSeqAccess<'a, 'de> {
    de: &'a mut Deserializer<'de>,
}

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

impl<'de: 'a, 'a> de::SeqAccess<'de> for PrimitiveSeqAccess<'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>,
    {
        match self.de.lexer.token {
            Token::Text | Token::Integer | Token::Float | Token::Char | Token::BracketOpen => {
                let result = seed.deserialize(&mut *self.de).map(Some);
                if result.is_err() {
                    return result;
                }

                if self.de.lexer.token != Token::Comma && self.de.lexer.token != Token::BracketClose
                {
                    return unexpected_token!(self.de.lexer, "<value> or ]");
                } else if self.de.lexer.token == Token::Comma {
                    self.de.lexer.advance();
                }

                result
            }
            Token::BracketClose => Ok(None),
            _ => unexpected_token!(self.de.lexer, "<value> or ]"),
        }
    }
}