buni-rs 1.2.0

Reference Buni serializer / deserializer in Rust
Documentation
use alloc::vec::Vec;
use core::cell::Cell;
use crate::deserialize::{AnnotatedList, Item};
use crate::{DeserializeError, Deserializer};
use nom::error::ErrorKind;
use nom::Input;
use serde_core::de::{DeserializeSeed, EnumAccess, VariantAccess, Visitor};
use serde_core::Deserializer as SerdeDeserializer;
use core::fmt::{Debug, Display};
use core::marker::PhantomData;

pub struct EnumDeserializer<I: Input + Debug + Display> {
    pub key: Cell<Option<Item>>,
    pub value: Cell<Option<Vec<Item>>>,
    pub phantom_data: PhantomData<I>
}

impl<I: Input + Debug + Display> EnumDeserializer<I> {
    pub fn new(annotated_list: AnnotatedList) -> Self {
        EnumDeserializer::<I> {
            key: Cell::new(Some(*annotated_list.0)),
            value: Cell::new(Some(annotated_list.1)),
            phantom_data: PhantomData,
        }
    }
}

impl<'de, I: Input + Debug + Display> EnumAccess<'de> for EnumDeserializer<I> {
    type Error = DeserializeError<I>;
    type Variant = Self;

    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
    where
        V: DeserializeSeed<'de>
    {
        match self.key.take() {
            Some(item) => Ok((seed.deserialize(&mut Deserializer::from_item(item))?, self)),
            _ => Err(DeserializeError::ParseError(None, ErrorKind::Eof))
        }
    }
}

impl<'de, I: Input + Debug + Display> VariantAccess<'de> for EnumDeserializer<I> {
    type Error = DeserializeError<I>;

    fn unit_variant(self) -> Result<(), Self::Error> {
        Err(DeserializeError::ExpectedString)
    }

    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
    where
        T: DeserializeSeed<'de>
    {
        match self.value.take() {
            None => Err(DeserializeError::ParseError(None, ErrorKind::Eof)),
            Some(item) => match item.into_iter().next() {
                None => Err(DeserializeError::ParseError(None, ErrorKind::Eof)),
                Some(item) => seed.deserialize(&mut Deserializer::from_item(item))
            }
        }
    }

    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>
    {
        match self.value.take() {
            None => Err(DeserializeError::ParseError(None, ErrorKind::Eof)),
            Some(item) => Deserializer::from_item(Item::List(item)).deserialize_seq(visitor)
        }
    }

    fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>
    {
        match self.value.take() {
            None => Err(DeserializeError::ParseError(None, ErrorKind::Eof)),
            Some(item) => Deserializer::from_item(Item::List(item)).deserialize_map(visitor)
        }
    }
}