toml/de/deserializer/
key.rs

1use serde::de::IntoDeserializer;
2
3use crate::de::DeString;
4use crate::de::Error;
5
6pub(crate) struct KeyDeserializer<'i> {
7    span: Option<core::ops::Range<usize>>,
8    key: DeString<'i>,
9}
10
11impl<'i> KeyDeserializer<'i> {
12    pub(crate) fn new(key: DeString<'i>, span: Option<core::ops::Range<usize>>) -> Self {
13        KeyDeserializer { span, key }
14    }
15}
16
17impl<'de> IntoDeserializer<'de, Error> for KeyDeserializer<'de> {
18    type Deserializer = Self;
19
20    fn into_deserializer(self) -> Self::Deserializer {
21        self
22    }
23}
24
25impl<'de> serde::de::Deserializer<'de> for KeyDeserializer<'de> {
26    type Error = Error;
27
28    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
29    where
30        V: serde::de::Visitor<'de>,
31    {
32        self.key.into_deserializer().deserialize_any(visitor)
33    }
34
35    fn deserialize_enum<V>(
36        self,
37        name: &str,
38        variants: &'static [&'static str],
39        visitor: V,
40    ) -> Result<V::Value, Self::Error>
41    where
42        V: serde::de::Visitor<'de>,
43    {
44        let _ = name;
45        let _ = variants;
46        visitor.visit_enum(self)
47    }
48
49    fn deserialize_struct<V>(
50        self,
51        name: &'static str,
52        _fields: &'static [&'static str],
53        visitor: V,
54    ) -> Result<V::Value, Error>
55    where
56        V: serde::de::Visitor<'de>,
57    {
58        if serde_spanned::de::is_spanned(name) {
59            if let Some(span) = self.span.clone() {
60                return visitor.visit_map(super::SpannedDeserializer::new(self.key, span));
61            } else {
62                return Err(Error::custom("value is missing a span", None));
63            }
64        }
65        self.deserialize_any(visitor)
66    }
67
68    fn deserialize_newtype_struct<V>(
69        self,
70        _name: &'static str,
71        visitor: V,
72    ) -> Result<V::Value, Error>
73    where
74        V: serde::de::Visitor<'de>,
75    {
76        visitor.visit_newtype_struct(self)
77    }
78
79    serde::forward_to_deserialize_any! {
80        bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
81        bytes byte_buf map option unit
82        ignored_any unit_struct tuple_struct tuple identifier
83    }
84}
85
86impl<'de> serde::de::EnumAccess<'de> for KeyDeserializer<'de> {
87    type Error = Error;
88    type Variant = UnitOnly<Self::Error>;
89
90    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
91    where
92        T: serde::de::DeserializeSeed<'de>,
93    {
94        seed.deserialize(self).map(unit_only)
95    }
96}
97
98pub(crate) struct UnitOnly<E> {
99    marker: core::marker::PhantomData<E>,
100}
101
102fn unit_only<T, E>(t: T) -> (T, UnitOnly<E>) {
103    (
104        t,
105        UnitOnly {
106            marker: core::marker::PhantomData,
107        },
108    )
109}
110
111impl<'de, E> serde::de::VariantAccess<'de> for UnitOnly<E>
112where
113    E: serde::de::Error,
114{
115    type Error = E;
116
117    fn unit_variant(self) -> Result<(), Self::Error> {
118        Ok(())
119    }
120
121    fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>
122    where
123        T: serde::de::DeserializeSeed<'de>,
124    {
125        Err(serde::de::Error::invalid_type(
126            serde::de::Unexpected::UnitVariant,
127            &"newtype variant",
128        ))
129    }
130
131    fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>
132    where
133        V: serde::de::Visitor<'de>,
134    {
135        Err(serde::de::Error::invalid_type(
136            serde::de::Unexpected::UnitVariant,
137            &"tuple variant",
138        ))
139    }
140
141    fn struct_variant<V>(
142        self,
143        _fields: &'static [&'static str],
144        _visitor: V,
145    ) -> Result<V::Value, Self::Error>
146    where
147        V: serde::de::Visitor<'de>,
148    {
149        Err(serde::de::Error::invalid_type(
150            serde::de::Unexpected::UnitVariant,
151            &"struct variant",
152        ))
153    }
154}