1use std::str;
2
3use _serde::{de, forward_to_deserialize_any};
4use lexical::{self, FromLexical};
5
6use crate::decode::Reference;
7
8use super::{
9 error::{Error, ErrorKind},
10 slices::{DecodedSlice, RawSlice, Value},
11};
12
13pub trait IntoDeserializer<'de, 's> {
14 type Deserializer: de::Deserializer<'de, Error = Error>;
16
17 fn into_deserializer(self, scratch: &'s mut Vec<u8>) -> Self::Deserializer;
19}
20
21impl<'de, 's> IntoDeserializer<'de, 's> for DecodedSlice<'de> {
24 type Deserializer = ValueDeserializer<'s, Self>;
25
26 fn into_deserializer(self, scratch: &'s mut Vec<u8>) -> Self::Deserializer {
27 ValueDeserializer(self, scratch)
28 }
29}
30
31impl<'de, 's> IntoDeserializer<'de, 's> for RawSlice<'de> {
32 type Deserializer = ValueDeserializer<'s, Self>;
33
34 fn into_deserializer(self, scratch: &'s mut Vec<u8>) -> Self::Deserializer {
35 ValueDeserializer(self, scratch)
36 }
37}
38
39impl<'de, 's> IntoDeserializer<'de, 's> for Option<RawSlice<'de>> {
40 type Deserializer = ValueDeserializer<'s, Self>;
41
42 fn into_deserializer(self, scratch: &'s mut Vec<u8>) -> Self::Deserializer {
43 ValueDeserializer(self, scratch)
44 }
45}
46
47pub struct ValueDeserializer<'s, T>(T, &'s mut Vec<u8>);
50
51macro_rules! deserialize_number {
52 ($($method:ident => $visit:ident) *) => {
53 $(
54 #[inline]
55 fn $method<V>(self, visitor: V) -> Result<V::Value,Error>
56 where
57 V: de::Visitor<'de>,
58 {
59 visitor.$visit(self.0.parse_number(self.1)?)
60 }
61 )*
62 };
63}
64
65impl<'de, 's, T> de::Deserializer<'de> for ValueDeserializer<'s, T>
66where
67 T: Value<'de>,
68{
69 type Error = Error;
70
71 #[inline]
72 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
73 where
74 V: de::Visitor<'de>,
75 {
76 match self.0.parse_str(self.1)? {
77 Reference::Borrowed(b) => visitor.visit_borrowed_str(b),
78 Reference::Copied(o) => visitor.visit_str(o),
79 Reference::Owned(o) => visitor.visit_string(o),
80 }
81 }
82
83 #[inline]
84 fn deserialize_newtype_struct<V>(self, _: &str, visitor: V) -> Result<V::Value, Error>
85 where
86 V: de::Visitor<'de>,
87 {
88 visitor.visit_newtype_struct(self)
89 }
90
91 #[inline]
92 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
93 where
94 V: de::Visitor<'de>,
95 {
96 visitor.visit_bool(self.0.parse_bool(self.1)?)
97 }
98
99 #[inline]
100 fn deserialize_enum<V>(
101 self,
102 _: &'static str,
103 _: &'static [&'static str],
104 visitor: V,
105 ) -> Result<V::Value, Error>
106 where
107 V: de::Visitor<'de>,
108 {
109 visitor.visit_enum(self)
110 }
111
112 #[inline]
113 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
114 where
115 V: de::Visitor<'de>,
116 {
117 if self.0.is_none() {
118 visitor.visit_none()
119 } else {
120 visitor.visit_some(self)
121 }
122 }
123
124 #[inline]
125 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
126 where
127 V: de::Visitor<'de>,
128 {
129 visitor.visit_unit()
130 }
131
132 #[inline]
134 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
135 where
136 V: de::Visitor<'de>,
137 {
138 match self.0.parse_bytes(self.1) {
139 Reference::Borrowed(b) => visitor.visit_borrowed_bytes(b),
140 Reference::Copied(c) => visitor.visit_bytes(c),
141 Reference::Owned(o) => visitor.visit_byte_buf(o),
142 }
143 }
144
145 #[inline]
146 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
147 where
148 V: de::Visitor<'de>,
149 {
150 self.deserialize_bytes(visitor)
151 }
152
153 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
154 where
155 V: de::Visitor<'de>,
156 {
157 self.deserialize_bytes(visitor)
158 }
159
160 forward_to_deserialize_any! {
161 <W: Visitor<'de>>
162 char str string unit unit_struct map struct
163 tuple seq tuple_struct
164 }
165
166 deserialize_number!(
167 deserialize_i8 => visit_i8
168 deserialize_i16 => visit_i16
169 deserialize_i32 => visit_i32
170 deserialize_i64 => visit_i64
171
172 deserialize_u8 => visit_u8
173 deserialize_u16 => visit_u16
174 deserialize_u32 => visit_u32
175 deserialize_u64 => visit_u64
176
177 deserialize_f32 => visit_f32
178 deserialize_f64 => visit_f64
179 );
180}
181
182impl<'de, 's, T> de::EnumAccess<'de> for ValueDeserializer<'s, T>
183where
184 T: Value<'de>,
185{
186 type Error = Error;
187 type Variant = UnitOnly;
188
189 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
190 where
191 V: de::DeserializeSeed<'de>,
192 {
193 seed.deserialize(self).map(|res| (res, UnitOnly))
194 }
195}
196
197pub trait IntoRawSlices<'de> {
200 type SizedIterator: Iterator<Item = RawSlice<'de>>;
201 type UnSizedIterator: Iterator<Item = RawSlice<'de>>;
202
203 fn into_sized_iterator(self, size: usize) -> Result<Self::SizedIterator, Error>;
204 fn into_unsized_iterator(self) -> Self::UnSizedIterator;
205 fn into_single_slice(self) -> RawSlice<'de>;
206}
207
208impl<'de, 's, I> IntoDeserializer<'de, 's> for I
209where
210 I: 'de + IntoRawSlices<'de>,
211{
212 type Deserializer = IterDeserializer<'s, I>;
213
214 fn into_deserializer(self, scratch: &'s mut Vec<u8>) -> Self::Deserializer {
215 IterDeserializer(self, scratch)
216 }
217}
218
219pub struct IterDeserializer<'s, I>(I, &'s mut Vec<u8>);
220
221impl<'de, 's, I> IterDeserializer<'s, I>
222where
223 I: 'de + IntoRawSlices<'de>,
224{
225 fn parse_number<T>(self) -> Result<T, Error>
226 where
227 T: FromLexical,
228 {
229 self.0.into_single_slice().parse_number(self.1)
230 }
231
232 #[inline]
233 fn into_slice_deserializer(self) -> ValueDeserializer<'s, RawSlice<'de>> {
234 ValueDeserializer(self.0.into_single_slice(), self.1)
235 }
236}
237
238macro_rules! deserialize_number {
239 ($($method:ident => $visit:ident) *) => {
240 $(
241 #[inline]
242 fn $method<V>(self, visitor: V) -> Result<V::Value,Error>
243 where
244 V: de::Visitor<'de>,
245 {
246 visitor.$visit(self.parse_number()?)
247 }
248 )*
249 };
250}
251
252impl<'de, 's, I> de::Deserializer<'de> for IterDeserializer<'s, I>
253where
254 I: 'de + IntoRawSlices<'de>,
255{
256 type Error = Error;
257
258 #[inline]
259 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
260 where
261 V: de::Visitor<'de>,
262 {
263 self.into_slice_deserializer().deserialize_any(visitor)
264 }
265
266 #[inline]
267 fn deserialize_newtype_struct<V>(self, _: &str, visitor: V) -> Result<V::Value, Error>
268 where
269 V: de::Visitor<'de>,
270 {
271 visitor.visit_newtype_struct(self)
272 }
273
274 #[inline]
275 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
276 where
277 V: de::Visitor<'de>,
278 {
279 self.into_slice_deserializer().deserialize_bool(visitor)
280 }
281
282 #[inline]
283 fn deserialize_enum<V>(
284 self,
285 name: &'static str,
286 variants: &'static [&'static str],
287 visitor: V,
288 ) -> Result<V::Value, Error>
289 where
290 V: de::Visitor<'de>,
291 {
292 self.into_slice_deserializer()
293 .deserialize_enum(name, variants, visitor)
294 }
295
296 #[inline]
297 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
298 where
299 V: de::Visitor<'de>,
300 {
301 visitor.visit_some(self)
302 }
303
304 #[inline]
305 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
306 where
307 V: de::Visitor<'de>,
308 {
309 visitor.visit_unit()
310 }
311
312 #[inline]
314 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
315 where
316 V: de::Visitor<'de>,
317 {
318 self.into_slice_deserializer().deserialize_bytes(visitor)
319 }
320
321 #[inline]
322 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
323 where
324 V: de::Visitor<'de>,
325 {
326 self.deserialize_bytes(visitor)
327 }
328
329 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
330 where
331 V: de::Visitor<'de>,
332 {
333 visitor.visit_seq(SizedIterDeserializer(
334 self.0.into_unsized_iterator(),
335 self.1,
336 ))
337 }
338
339 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
340 where
341 V: de::Visitor<'de>,
342 {
343 visitor.visit_seq(SizedIterDeserializer(
344 self.0.into_sized_iterator(len)?,
345 self.1,
346 ))
347 }
348
349 fn deserialize_tuple_struct<V>(
350 self,
351 _: &'static str,
352 len: usize,
353 visitor: V,
354 ) -> Result<V::Value, Self::Error>
355 where
356 V: de::Visitor<'de>,
357 {
358 visitor.visit_seq(SizedIterDeserializer(
359 self.0.into_sized_iterator(len)?,
360 self.1,
361 ))
362 }
363
364 forward_to_deserialize_any! {
365 <W: Visitor<'de>>
366 char str string unit unit_struct map struct identifier
367 }
368
369 deserialize_number!(
370 deserialize_i8 => visit_i8
371 deserialize_i16 => visit_i16
372 deserialize_i32 => visit_i32
373 deserialize_i64 => visit_i64
374
375 deserialize_u8 => visit_u8
376 deserialize_u16 => visit_u16
377 deserialize_u32 => visit_u32
378 deserialize_u64 => visit_u64
379
380 deserialize_f32 => visit_f32
381 deserialize_f64 => visit_f64
382 );
383}
384
385struct SizedIterDeserializer<'s, I>(I, &'s mut Vec<u8>);
386
387impl<'de, 's, I> de::SeqAccess<'de> for SizedIterDeserializer<'s, I>
388where
389 I: 'de + Iterator<Item = RawSlice<'de>>,
390{
391 type Error = Error;
392
393 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
394 where
395 T: de::DeserializeSeed<'de>,
396 {
397 self.0
398 .next()
399 .map(|v| seed.deserialize(v.into_deserializer(self.1)))
400 .transpose()
401 }
402}
403
404pub struct UnitOnly;
405
406impl<'de> de::VariantAccess<'de> for UnitOnly {
407 type Error = Error;
408
409 fn unit_variant(self) -> Result<(), Self::Error> {
410 Ok(())
411 }
412
413 #[cold]
414 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>
415 where
416 V: de::Visitor<'de>,
417 {
418 Err(Error::new(ErrorKind::InvalidType)
419 .message(String::from("Tuple enums are not supported")))
420 }
421
422 #[cold]
423 fn struct_variant<V>(
424 self,
425 _fields: &'static [&'static str],
426 _visitor: V,
427 ) -> Result<V::Value, Self::Error>
428 where
429 V: de::Visitor<'de>,
430 {
431 Err(Error::new(ErrorKind::InvalidType)
432 .message(String::from("Struct enums are not supported")))
433 }
434
435 #[cold]
436 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>
437 where
438 T: de::DeserializeSeed<'de>,
439 {
440 Err(Error::new(ErrorKind::InvalidType)
441 .message(String::from("NewType enums are not supported")))
442 }
443}