1 use serde::de::IntoDeserializer;
2 
3 use crate::de::Error;
4 
5 pub(crate) struct TableDeserializer {
6     span: Option<std::ops::Range<usize>>,
7     items: crate::table::KeyValuePairs,
8 }
9 
10 // Note: this is wrapped by `Deserializer` and `ValueDeserializer` and any trait methods
11 // implemented here need to be wrapped there
12 impl<'de> serde::Deserializer<'de> for TableDeserializer {
13     type Error = Error;
14 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: serde::de::Visitor<'de>,15     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
16     where
17         V: serde::de::Visitor<'de>,
18     {
19         visitor.visit_map(crate::de::TableMapAccess::new(self))
20     }
21 
22     // `None` is interpreted as a missing field so be sure to implement `Some`
23     // as a present field.
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> where V: serde::de::Visitor<'de>,24     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
25     where
26         V: serde::de::Visitor<'de>,
27     {
28         visitor.visit_some(self)
29     }
30 
deserialize_newtype_struct<V>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, Error> where V: serde::de::Visitor<'de>,31     fn deserialize_newtype_struct<V>(
32         self,
33         _name: &'static str,
34         visitor: V,
35     ) -> Result<V::Value, Error>
36     where
37         V: serde::de::Visitor<'de>,
38     {
39         visitor.visit_newtype_struct(self)
40     }
41 
deserialize_struct<V>( self, name: &'static str, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: serde::de::Visitor<'de>,42     fn deserialize_struct<V>(
43         self,
44         name: &'static str,
45         fields: &'static [&'static str],
46         visitor: V,
47     ) -> Result<V::Value, Error>
48     where
49         V: serde::de::Visitor<'de>,
50     {
51         if serde_spanned::__unstable::is_spanned(name, fields) {
52             if let Some(span) = self.span.clone() {
53                 return visitor.visit_map(super::SpannedDeserializer::new(self, span));
54             }
55         }
56 
57         self.deserialize_any(visitor)
58     }
59 
60     // Called when the type to deserialize is an enum, as opposed to a field in the type.
deserialize_enum<V>( self, _name: &'static str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: serde::de::Visitor<'de>,61     fn deserialize_enum<V>(
62         self,
63         _name: &'static str,
64         _variants: &'static [&'static str],
65         visitor: V,
66     ) -> Result<V::Value, Error>
67     where
68         V: serde::de::Visitor<'de>,
69     {
70         if self.items.is_empty() {
71             Err(crate::de::Error::custom(
72                 "wanted exactly 1 element, found 0 elements",
73                 self.span,
74             ))
75         } else if self.items.len() != 1 {
76             Err(crate::de::Error::custom(
77                 "wanted exactly 1 element, more than 1 element",
78                 self.span,
79             ))
80         } else {
81             visitor.visit_enum(crate::de::TableMapAccess::new(self))
82         }
83     }
84 
85     serde::forward_to_deserialize_any! {
86         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
87         bytes byte_buf map unit
88         ignored_any unit_struct tuple_struct tuple identifier
89     }
90 }
91 
92 impl<'de> serde::de::IntoDeserializer<'de, crate::de::Error> for TableDeserializer {
93     type Deserializer = TableDeserializer;
94 
into_deserializer(self) -> Self::Deserializer95     fn into_deserializer(self) -> Self::Deserializer {
96         self
97     }
98 }
99 
100 impl crate::Table {
into_deserializer(self) -> TableDeserializer101     pub(crate) fn into_deserializer(self) -> TableDeserializer {
102         TableDeserializer {
103             span: self.span(),
104             items: self.items,
105         }
106     }
107 }
108 
109 impl crate::InlineTable {
into_deserializer(self) -> TableDeserializer110     pub(crate) fn into_deserializer(self) -> TableDeserializer {
111         TableDeserializer {
112             span: self.span(),
113             items: self.items,
114         }
115     }
116 }
117 
118 pub(crate) struct TableMapAccess {
119     iter: indexmap::map::IntoIter<crate::InternalString, crate::table::TableKeyValue>,
120     span: Option<std::ops::Range<usize>>,
121     value: Option<(crate::Key, crate::Item)>,
122 }
123 
124 impl TableMapAccess {
new(input: TableDeserializer) -> Self125     pub(crate) fn new(input: TableDeserializer) -> Self {
126         Self {
127             iter: input.items.into_iter(),
128             span: input.span,
129             value: None,
130         }
131     }
132 }
133 
134 impl<'de> serde::de::MapAccess<'de> for TableMapAccess {
135     type Error = Error;
136 
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error> where K: serde::de::DeserializeSeed<'de>,137     fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
138     where
139         K: serde::de::DeserializeSeed<'de>,
140     {
141         match self.iter.next() {
142             Some((k, v)) => {
143                 let ret = seed
144                     .deserialize(super::KeyDeserializer::new(k, v.key.span()))
145                     .map(Some)
146                     .map_err(|mut e: Self::Error| {
147                         if e.span().is_none() {
148                             e.set_span(v.key.span());
149                         }
150                         e
151                     });
152                 self.value = Some((v.key, v.value));
153                 ret
154             }
155             None => Ok(None),
156         }
157     }
158 
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error> where V: serde::de::DeserializeSeed<'de>,159     fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
160     where
161         V: serde::de::DeserializeSeed<'de>,
162     {
163         match self.value.take() {
164             Some((k, v)) => {
165                 let span = v.span().or_else(|| k.span());
166                 seed.deserialize(crate::de::ValueDeserializer::new(v))
167                     .map_err(|mut e: Self::Error| {
168                         if e.span().is_none() {
169                             e.set_span(span);
170                         }
171                         e.add_key(k.get().to_owned());
172                         e
173                     })
174             }
175             None => {
176                 panic!("no more values in next_value_seed, internal error in ValueDeserializer")
177             }
178         }
179     }
180 }
181 
182 impl<'de> serde::de::EnumAccess<'de> for TableMapAccess {
183     type Error = Error;
184     type Variant = super::TableEnumDeserializer;
185 
variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: serde::de::DeserializeSeed<'de>,186     fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
187     where
188         V: serde::de::DeserializeSeed<'de>,
189     {
190         let (key, value) = match self.iter.next() {
191             Some(pair) => pair,
192             None => {
193                 return Err(Error::custom(
194                     "expected table with exactly 1 entry, found empty table",
195                     self.span,
196                 ));
197             }
198         };
199 
200         let val = seed
201             .deserialize(key.into_deserializer())
202             .map_err(|mut e: Self::Error| {
203                 if e.span().is_none() {
204                     e.set_span(value.key.span());
205                 }
206                 e
207             })?;
208 
209         let variant = super::TableEnumDeserializer::new(value.value);
210 
211         Ok((val, variant))
212     }
213 }
214