use {
crate::{
de::Deserializer,
error::{Error, ErrorCode::*, Result},
},
serde::de::{DeserializeSeed, MapAccess},
};
pub struct MapReader<'a, 'de: 'a> {
de: &'a mut Deserializer<'de>,
}
impl<'a, 'de> MapReader<'a, 'de> {
pub fn new(de: &'a mut Deserializer<'de>) -> Self {
MapReader { de }
}
}
impl<'de, 'a> MapAccess<'de> for MapReader<'a, 'de> {
type Error = Error;
fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
where
K: DeserializeSeed<'de>,
{
self.de.eat_shit_and(Some(','))?;
if self.de.peek_char()? == '}' {
return Ok(None);
}
self.de.accept_quoteless = false;
let v = seed.deserialize(&mut *self.de)?;
self.de.eat_shit()?;
if self.de.next_char()? == ':' {
Ok(Some(v))
} else {
self.de.fail(ExpectedMapColon)
}
}
fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
where
V: DeserializeSeed<'de>,
{
self.de.eat_shit()?;
let v = seed.deserialize(&mut *self.de);
self.de.eat_shit_and(Some(','))?;
v
}
}