use serde_core::de::{DeserializeSeed, MapAccess};
use crate::{
de::Deserializer,
error::{Error, Result},
tokens::Token,
};
#[derive(Debug)]
pub struct ObjEater<'a, 'de: 'a> {
de: &'a mut Deserializer<'de>,
}
impl<'a, 'de> ObjEater<'a, 'de> {
pub fn try_new(de: &'a mut Deserializer<'de>) -> Result<Self> {
while let Some(Token::Key(_)) = de.peek() {
de.next();
}
match de.next() {
Some(Token::ObjBegin) => Ok(Self { de }),
Some(_) => Err(Error::ExpectedObjectStart),
None => Err(Error::EofWhileParsingObject),
}
}
}
impl<'de> MapAccess<'de> for ObjEater<'_, 'de> {
type Error = Error;
fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
where
K: DeserializeSeed<'de>,
{
match self.de.peek() {
Some(Token::Key(_)) => seed.deserialize(&mut *self.de).map(Some),
Some(Token::ObjEnd) => {
self.de.next();
Ok(None)
}
Some(_) => Err(Error::ExpectedSomeIdent),
None => Err(Error::EofWhileParsingObject),
}
}
fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
where
V: DeserializeSeed<'de>,
{
if self.de.peek_is_value() {
seed.deserialize(&mut *self.de)
} else {
Err(Error::ExpectedSomeValue)
}
}
}