1use serde::{Deserializer, de::{self, Error, IntoDeserializer, MapAccess, SeqAccess}};
2
3use crate::data::{BytesDeserializer, Data, DataKey, KeyDeserializer};
4
5impl<'de> Deserializer<'de> for &'de Data {
6 type Error = de::value::Error;
7
8 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
9 where
10 V: de::Visitor<'de>,
11 {
12 match self {
13 Data::Nil => visitor.visit_unit(),
14 Data::Boolean(b) => visitor.visit_bool(*b),
15 Data::Integer(i) => visitor.visit_i64(*i),
16 Data::Number(n) => visitor.visit_f64(*n),
17 Data::String(s) => visitor.visit_borrowed_str(s),
18 Data::List(l) => visitor.visit_seq(SeqDeserializer { iter: l.iter() }),
19 Data::Dict(d) => visitor.visit_map(MapDeserializer { iter: d.iter(), value: None }),
20 Data::Id(i) => visitor.visit_u64(i.get()),
21 Data::Url(u) => u.into_deserializer().deserialize_any(visitor),
22 Data::Path(_) => Err(Error::custom("path not supported")),
23 Data::Bytes(b) => BytesDeserializer(b.into()).deserialize_any(visitor),
24 Data::Any(_) => Err(Error::custom("any not supported")),
25 }
26 }
27
28 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
29 where
30 V: de::Visitor<'de>,
31 {
32 visitor.visit_bool(self.try_into().map_err(Error::custom)?)
33 }
34
35 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
36 where
37 V: de::Visitor<'de>,
38 {
39 visitor.visit_i8(self.try_into().map_err(Error::custom)?)
40 }
41
42 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
43 where
44 V: de::Visitor<'de>,
45 {
46 visitor.visit_i16(self.try_into().map_err(Error::custom)?)
47 }
48
49 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
50 where
51 V: de::Visitor<'de>,
52 {
53 visitor.visit_i32(self.try_into().map_err(Error::custom)?)
54 }
55
56 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
57 where
58 V: de::Visitor<'de>,
59 {
60 visitor.visit_i64(self.try_into().map_err(Error::custom)?)
61 }
62
63 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
64 where
65 V: de::Visitor<'de>,
66 {
67 visitor.visit_u8(self.try_into().map_err(Error::custom)?)
68 }
69
70 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
71 where
72 V: de::Visitor<'de>,
73 {
74 visitor.visit_u16(self.try_into().map_err(Error::custom)?)
75 }
76
77 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
78 where
79 V: de::Visitor<'de>,
80 {
81 visitor.visit_u32(self.try_into().map_err(Error::custom)?)
82 }
83
84 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
85 where
86 V: de::Visitor<'de>,
87 {
88 visitor.visit_u64(self.try_into().map_err(Error::custom)?)
89 }
90
91 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
92 where
93 V: de::Visitor<'de>,
94 {
95 visitor.visit_f32(self.try_into().map_err(Error::custom)?)
96 }
97
98 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
99 where
100 V: de::Visitor<'de>,
101 {
102 visitor.visit_f64(self.try_into().map_err(Error::custom)?)
103 }
104
105 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
106 where
107 V: de::Visitor<'de>,
108 {
109 let s: &str = self.try_into().map_err(Error::custom)?;
110 let mut chars = s.chars();
111 match (chars.next(), chars.next()) {
112 (Some(ch), None) => visitor.visit_char(ch),
113 _ => Err(Error::custom("not a char")),
114 }
115 }
116
117 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
118 where
119 V: de::Visitor<'de>,
120 {
121 visitor.visit_borrowed_str(self.try_into().map_err(Error::custom)?)
122 }
123
124 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
125 where
126 V: de::Visitor<'de>,
127 {
128 match self {
129 Data::Url(u) => visitor.visit_newtype_struct(u.into_deserializer()),
130 _ => self.deserialize_str(visitor),
131 }
132 }
133
134 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
135 where
136 V: de::Visitor<'de>,
137 {
138 match self {
139 Data::Bytes(b) => BytesDeserializer(b.into()).deserialize_bytes(visitor),
140 _ => Err(Error::custom("not bytes")),
141 }
142 }
143
144 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
145 where
146 V: de::Visitor<'de>,
147 {
148 self.deserialize_bytes(visitor)
149 }
150
151 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
152 where
153 V: de::Visitor<'de>,
154 {
155 match self {
156 Data::Nil => visitor.visit_none(),
157 _ => visitor.visit_some(self),
158 }
159 }
160
161 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
162 where
163 V: de::Visitor<'de>,
164 {
165 match self {
166 Data::Nil => visitor.visit_unit(),
167 _ => Err(Error::custom("expected unit")),
168 }
169 }
170
171 fn deserialize_unit_struct<V>(
172 self,
173 _name: &'static str,
174 visitor: V,
175 ) -> Result<V::Value, Self::Error>
176 where
177 V: de::Visitor<'de>,
178 {
179 match self {
180 Data::Nil => visitor.visit_unit(),
181 _ => Err(Error::custom("expected unit struct")),
182 }
183 }
184
185 fn deserialize_newtype_struct<V>(
186 self,
187 _name: &'static str,
188 visitor: V,
189 ) -> Result<V::Value, Self::Error>
190 where
191 V: de::Visitor<'de>,
192 {
193 visitor.visit_newtype_struct(self)
194 }
195
196 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
197 where
198 V: de::Visitor<'de>,
199 {
200 match self {
201 Data::List(l) => visitor.visit_seq(SeqDeserializer { iter: l.iter() }),
202 Data::Bytes(b) => BytesDeserializer(b.into()).deserialize_seq(visitor),
203 _ => Err(Error::custom("not a sequence")),
204 }
205 }
206
207 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
208 where
209 V: de::Visitor<'de>,
210 {
211 self.deserialize_seq(visitor)
212 }
213
214 fn deserialize_tuple_struct<V>(
215 self,
216 _name: &'static str,
217 _len: usize,
218 visitor: V,
219 ) -> Result<V::Value, Self::Error>
220 where
221 V: de::Visitor<'de>,
222 {
223 self.deserialize_seq(visitor)
224 }
225
226 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
227 where
228 V: de::Visitor<'de>,
229 {
230 match self {
231 Data::Dict(d) => visitor.visit_map(MapDeserializer { iter: d.iter(), value: None }),
232 Data::Url(u) => u.into_deserializer().deserialize_map(visitor),
233 _ => Err(Error::custom("not a map")),
234 }
235 }
236
237 fn deserialize_struct<V>(
238 self,
239 _name: &'static str,
240 _fields: &'static [&'static str],
241 visitor: V,
242 ) -> Result<V::Value, Self::Error>
243 where
244 V: de::Visitor<'de>,
245 {
246 self.deserialize_map(visitor)
247 }
248
249 fn deserialize_enum<V>(
250 self,
251 _name: &'static str,
252 _variants: &'static [&'static str],
253 visitor: V,
254 ) -> Result<V::Value, Self::Error>
255 where
256 V: de::Visitor<'de>,
257 {
258 match self {
259 Data::String(s) => visitor.visit_enum((&**s).into_deserializer()),
260 _ => Err(Error::custom("not an enum")),
261 }
262 }
263
264 fn deserialize_identifier<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
265 where
266 V: de::Visitor<'de>,
267 {
268 Err(Error::custom("identifier not supported"))
269 }
270
271 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
272 where
273 V: de::Visitor<'de>,
274 {
275 visitor.visit_unit()
276 }
277}
278
279impl<'de> IntoDeserializer<'de, de::value::Error> for &'de Data {
280 type Deserializer = Self;
281
282 fn into_deserializer(self) -> Self::Deserializer { self }
283}
284
285struct SeqDeserializer<'a> {
287 iter: std::slice::Iter<'a, Data>,
288}
289
290impl<'de> SeqAccess<'de> for SeqDeserializer<'de> {
291 type Error = de::value::Error;
292
293 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
294 where
295 T: de::DeserializeSeed<'de>,
296 {
297 self.iter.next().map(|value| seed.deserialize(value)).transpose()
298 }
299
300 fn size_hint(&self) -> Option<usize> { Some(self.iter.len()) }
301}
302
303struct MapDeserializer<'a> {
305 iter: hashbrown::hash_map::Iter<'a, DataKey, Data>,
306 value: Option<&'a Data>,
307}
308
309impl<'de> MapAccess<'de> for MapDeserializer<'de> {
310 type Error = de::value::Error;
311
312 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
313 where
314 K: de::DeserializeSeed<'de>,
315 {
316 let Some((key, value)) = self.iter.next() else { return Ok(None) };
317 self.value = Some(value);
318
319 seed.deserialize(KeyDeserializer::Borrowed(key)).map(Some)
320 }
321
322 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
323 where
324 V: de::DeserializeSeed<'de>,
325 {
326 seed.deserialize(self.value.take().ok_or_else(|| Error::custom("value missing for key"))?)
327 }
328
329 fn size_hint(&self) -> Option<usize> { Some(self.iter.len()) }
330}