anyseq 0.2.0

Automatically generate serde Deserializer from separated values.
Documentation
use crate::de::{self, Deserializer};
use crate::{Lexer, Token};

pub struct TokenIter;

impl<I, O> Lexer<I, Token<O>> for TokenIter
where
    I: Iterator<Item = Token<O>>,
{
    type Error = ();

    fn item(input: &mut I) -> Result<Token<O>, Self::Error> {
        match input.next() {
            Some(item) => Ok(item),
            None => Ok(Token::Eof),
        }
    }
}

pub fn from_iter<'de, T, I>(
    iter: I,
) -> Result<T, de::Error<<TokenIter as Lexer<I, Token<&'de str>>>::Error>>
where
    I: Iterator<Item = Token<&'de str>>,
    T: serde::Deserialize<'de>,
{
    let mut de = Deserializer::<TokenIter, _, _>::new(iter);
    T::deserialize(&mut de)
}

#[cfg(test)]
mod tests {
    use super::*;
    use serde::Deserialize;

    #[test]
    fn test_seq_access() {
        let tokens = vec![
            Token::SeqStart { len: None },
            Token::Item("1"),
            Token::Item("2"),
            Token::Item("3"),
            Token::SeqEnd,
        ];
        assert_eq!(
            from_iter::<Vec<i8>, _>(tokens.into_iter()).unwrap(),
            vec![1, 2, 3]
        );
    }

    #[test]
    fn test_struct() {
        #[derive(Deserialize, Debug, PartialEq)]
        struct Test {
            name: String,
            age: u32,
        }

        let tokens = vec![
            Token::MapStart { len: None },
            Token::Item("age"),
            Token::Item("21"),
            Token::Item("name"),
            Token::Item("John"),
            Token::MapEnd,
        ];
        assert_eq!(
            from_iter::<Test, _>(tokens.into_iter()).unwrap(),
            Test {
                name: "John".to_string(),
                age: 21
            }
        );

        let tokens = vec![
            Token::SeqStart { len: None },
            Token::MapStart { len: None },
            Token::Item("name"),
            Token::Item("John"),
            Token::Item("age"),
            Token::Item("21"),
            Token::MapEnd,
            Token::MapStart { len: None },
            Token::Item("name"),
            Token::Item("Jane"),
            Token::Item("age"),
            Token::Item("31"),
            Token::MapEnd,
            Token::SeqEnd,
        ];

        assert_eq!(
            from_iter::<Vec<Test>, _>(tokens.into_iter()).unwrap(),
            vec![
                Test {
                    name: "John".to_string(),
                    age: 21
                },
                Test {
                    name: "Jane".to_string(),
                    age: 31
                }
            ]
        );
    }
}