use serde::de;
use crate::de::deserialize::{forward_to_inner_deserialize, Access, Error, SmallishDe};
use crate::syntax::Event;
#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct InlineHandler<'a, De> {
de: &'a mut De,
}
impl<'a, De> InlineHandler<'a, De> {
pub(crate) fn new(de: &'a mut De) -> Self {
Self { de }
}
}
impl<'a, 'de, De> SmallishDe<'de> for &mut InlineHandler<'a, De>
where
for<'b> &'b mut De: SmallishDe<'de>,
{
#[inline]
fn base(self) -> impl SmallishDe<'de> {
self.de.base()
}
}
impl<'a, 'de, De> de::Deserializer<'de> for &mut InlineHandler<'a, De>
where
for<'b> &'b mut De: SmallishDe<'de>,
{
type Error = Error;
forward_to_inner_deserialize! {
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
bytes byte_buf option unit unit_struct
enum identifier ignored_any
}
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: de::Visitor<'de>,
{
match self.de.peek()? {
Event::Key(_) | Event::EnumClose => self.deserialize_map(visitor),
_ => self.deserialize_seq(visitor),
}
}
fn deserialize_newtype_struct<V>(
self,
name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: de::Visitor<'de>,
{
self.hook_special(name, visitor, |de, visitor| {
visitor.visit_newtype_struct(de)
})
}
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: de::Visitor<'de>,
{
visitor.visit_seq(Access::new(&mut *self.de))
}
fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: de::Visitor<'de>,
{
self.deserialize_seq(visitor)
}
fn deserialize_tuple_struct<V>(
self,
_name: &'static str,
_len: usize,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: de::Visitor<'de>,
{
self.deserialize_seq(visitor)
}
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: de::Visitor<'de>,
{
visitor.visit_map(Access::new(&mut *self.de))
}
fn deserialize_struct<V>(
self,
name: &'static str,
_fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: de::Visitor<'de>,
{
self.hook_special(name, visitor, |de, visitor| de.deserialize_map(visitor))
}
}