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)
}
}
}