use serde::de::IntoDeserializer; use super::Error; pub(crate) struct KeyDeserializer { span: Option>, key: crate::InternalString, } impl KeyDeserializer { pub(crate) fn new(key: crate::InternalString, span: Option>) -> Self { KeyDeserializer { span, key } } } impl<'de> serde::de::IntoDeserializer<'de, Error> for KeyDeserializer { type Deserializer = Self; fn into_deserializer(self) -> Self::Deserializer { self } } impl<'de> serde::de::Deserializer<'de> for KeyDeserializer { type Error = Error; fn deserialize_any(self, visitor: V) -> Result where V: serde::de::Visitor<'de>, { self.key.into_deserializer().deserialize_any(visitor) } fn deserialize_enum( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result where V: serde::de::Visitor<'de>, { let _ = name; let _ = variants; visitor.visit_enum(self) } fn deserialize_struct( self, name: &'static str, fields: &'static [&'static str], visitor: V, ) -> Result where V: serde::de::Visitor<'de>, { if serde_spanned::__unstable::is_spanned(name, fields) { if let Some(span) = self.span.clone() { return visitor.visit_map(super::SpannedDeserializer::new(self.key.as_str(), span)); } } self.deserialize_any(visitor) } fn deserialize_newtype_struct( self, _name: &'static str, visitor: V, ) -> Result where V: serde::de::Visitor<'de>, { visitor.visit_newtype_struct(self) } serde::forward_to_deserialize_any! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq bytes byte_buf map option unit ignored_any unit_struct tuple_struct tuple identifier } } impl<'de> serde::de::EnumAccess<'de> for KeyDeserializer { type Error = super::Error; type Variant = UnitOnly; fn variant_seed(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: serde::de::DeserializeSeed<'de>, { seed.deserialize(self).map(unit_only) } } pub(crate) struct UnitOnly { marker: std::marker::PhantomData, } fn unit_only(t: T) -> (T, UnitOnly) { ( t, UnitOnly { marker: std::marker::PhantomData, }, ) } impl<'de, E> serde::de::VariantAccess<'de> for UnitOnly where E: serde::de::Error, { type Error = E; fn unit_variant(self) -> Result<(), Self::Error> { Ok(()) } fn newtype_variant_seed(self, _seed: T) -> Result where T: serde::de::DeserializeSeed<'de>, { Err(serde::de::Error::invalid_type( serde::de::Unexpected::UnitVariant, &"newtype variant", )) } fn tuple_variant(self, _len: usize, _visitor: V) -> Result where V: serde::de::Visitor<'de>, { Err(serde::de::Error::invalid_type( serde::de::Unexpected::UnitVariant, &"tuple variant", )) } fn struct_variant( self, _fields: &'static [&'static str], _visitor: V, ) -> Result where V: serde::de::Visitor<'de>, { Err(serde::de::Error::invalid_type( serde::de::Unexpected::UnitVariant, &"struct variant", )) } }