1 //! Building blocks for deserializing basic values using the `IntoDeserializer`
2 //! trait.
3 //!
4 //! ```edition2021
5 //! use serde::de::{value, Deserialize, IntoDeserializer};
6 //! use serde_derive::Deserialize;
7 //! use std::str::FromStr;
8 //!
9 //! #[derive(Deserialize)]
10 //! enum Setting {
11 //!     On,
12 //!     Off,
13 //! }
14 //!
15 //! impl FromStr for Setting {
16 //!     type Err = value::Error;
17 //!
18 //!     fn from_str(s: &str) -> Result<Self, Self::Err> {
19 //!         Self::deserialize(s.into_deserializer())
20 //!     }
21 //! }
22 //! ```
23 
24 use crate::lib::*;
25 
26 use self::private::{First, Second};
27 use crate::de::{self, size_hint, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor};
28 use crate::ser;
29 
30 ////////////////////////////////////////////////////////////////////////////////
31 
32 // For structs that contain a PhantomData. We do not want the trait
33 // bound `E: Clone` inferred by derive(Clone).
34 macro_rules! impl_copy_clone {
35     ($ty:ident $(<$lifetime:tt>)*) => {
36         impl<$($lifetime,)* E> Copy for $ty<$($lifetime,)* E> {}
37 
38         impl<$($lifetime,)* E> Clone for $ty<$($lifetime,)* E> {
39             fn clone(&self) -> Self {
40                 *self
41             }
42         }
43     };
44 }
45 
46 ////////////////////////////////////////////////////////////////////////////////
47 
48 /// A minimal representation of all possible errors that can occur using the
49 /// `IntoDeserializer` trait.
50 #[derive(Clone, PartialEq)]
51 pub struct Error {
52     err: ErrorImpl,
53 }
54 
55 #[cfg(any(feature = "std", feature = "alloc"))]
56 type ErrorImpl = Box<str>;
57 #[cfg(not(any(feature = "std", feature = "alloc")))]
58 type ErrorImpl = ();
59 
60 impl de::Error for Error {
61     #[cfg(any(feature = "std", feature = "alloc"))]
62     #[cold]
custom<T>(msg: T) -> Self where T: Display,63     fn custom<T>(msg: T) -> Self
64     where
65         T: Display,
66     {
67         Error {
68             err: msg.to_string().into_boxed_str(),
69         }
70     }
71 
72     #[cfg(not(any(feature = "std", feature = "alloc")))]
73     #[cold]
custom<T>(msg: T) -> Self where T: Display,74     fn custom<T>(msg: T) -> Self
75     where
76         T: Display,
77     {
78         let _ = msg;
79         Error { err: () }
80     }
81 }
82 
83 impl ser::Error for Error {
84     #[cold]
custom<T>(msg: T) -> Self where T: Display,85     fn custom<T>(msg: T) -> Self
86     where
87         T: Display,
88     {
89         de::Error::custom(msg)
90     }
91 }
92 
93 impl Display for Error {
94     #[cfg(any(feature = "std", feature = "alloc"))]
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result95     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
96         formatter.write_str(&self.err)
97     }
98 
99     #[cfg(not(any(feature = "std", feature = "alloc")))]
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result100     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
101         formatter.write_str("Serde deserialization error")
102     }
103 }
104 
105 impl Debug for Error {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result106     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
107         let mut debug = formatter.debug_tuple("Error");
108         #[cfg(any(feature = "std", feature = "alloc"))]
109         debug.field(&self.err);
110         debug.finish()
111     }
112 }
113 
114 #[cfg(feature = "std")]
115 #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))]
116 impl error::Error for Error {
description(&self) -> &str117     fn description(&self) -> &str {
118         &self.err
119     }
120 }
121 
122 ////////////////////////////////////////////////////////////////////////////////
123 
124 impl<'de, E> IntoDeserializer<'de, E> for ()
125 where
126     E: de::Error,
127 {
128     type Deserializer = UnitDeserializer<E>;
129 
into_deserializer(self) -> UnitDeserializer<E>130     fn into_deserializer(self) -> UnitDeserializer<E> {
131         UnitDeserializer::new()
132     }
133 }
134 
135 /// A deserializer holding a `()`.
136 pub struct UnitDeserializer<E> {
137     marker: PhantomData<E>,
138 }
139 
140 impl_copy_clone!(UnitDeserializer);
141 
142 impl<E> UnitDeserializer<E> {
143     #[allow(missing_docs)]
new() -> Self144     pub fn new() -> Self {
145         UnitDeserializer {
146             marker: PhantomData,
147         }
148     }
149 }
150 
151 impl<'de, E> de::Deserializer<'de> for UnitDeserializer<E>
152 where
153     E: de::Error,
154 {
155     type Error = E;
156 
157     forward_to_deserialize_any! {
158         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
159         bytes byte_buf unit unit_struct newtype_struct seq tuple tuple_struct
160         map struct enum identifier ignored_any
161     }
162 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,163     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
164     where
165         V: de::Visitor<'de>,
166     {
167         visitor.visit_unit()
168     }
169 
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,170     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
171     where
172         V: de::Visitor<'de>,
173     {
174         visitor.visit_none()
175     }
176 }
177 
178 impl<E> Debug for UnitDeserializer<E> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result179     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
180         formatter.debug_struct("UnitDeserializer").finish()
181     }
182 }
183 
184 ////////////////////////////////////////////////////////////////////////////////
185 
186 /// A deserializer that cannot be instantiated.
187 #[cfg(feature = "unstable")]
188 #[cfg_attr(doc_cfg, doc(cfg(feature = "unstable")))]
189 pub struct NeverDeserializer<E> {
190     never: !,
191     marker: PhantomData<E>,
192 }
193 
194 #[cfg(feature = "unstable")]
195 #[cfg_attr(doc_cfg, doc(cfg(feature = "unstable")))]
196 impl<'de, E> IntoDeserializer<'de, E> for !
197 where
198     E: de::Error,
199 {
200     type Deserializer = NeverDeserializer<E>;
201 
into_deserializer(self) -> Self::Deserializer202     fn into_deserializer(self) -> Self::Deserializer {
203         self
204     }
205 }
206 
207 #[cfg(feature = "unstable")]
208 impl<'de, E> de::Deserializer<'de> for NeverDeserializer<E>
209 where
210     E: de::Error,
211 {
212     type Error = E;
213 
deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,214     fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
215     where
216         V: de::Visitor<'de>,
217     {
218         self.never
219     }
220 
221     forward_to_deserialize_any! {
222         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
223         bytes byte_buf option unit unit_struct newtype_struct seq tuple
224         tuple_struct map struct enum identifier ignored_any
225     }
226 }
227 
228 ////////////////////////////////////////////////////////////////////////////////
229 
230 macro_rules! primitive_deserializer {
231     ($ty:ty, $doc:tt, $name:ident, $method:ident $($cast:tt)*) => {
232         #[doc = "A deserializer holding"]
233         #[doc = $doc]
234         pub struct $name<E> {
235             value: $ty,
236             marker: PhantomData<E>
237         }
238 
239         impl_copy_clone!($name);
240 
241         impl<'de, E> IntoDeserializer<'de, E> for $ty
242         where
243             E: de::Error,
244         {
245             type Deserializer = $name<E>;
246 
247             fn into_deserializer(self) -> $name<E> {
248                 $name::new(self)
249             }
250         }
251 
252         impl<E> $name<E> {
253             #[allow(missing_docs)]
254             pub fn new(value: $ty) -> Self {
255                 $name {
256                     value,
257                     marker: PhantomData,
258                 }
259             }
260         }
261 
262         impl<'de, E> de::Deserializer<'de> for $name<E>
263         where
264             E: de::Error,
265         {
266             type Error = E;
267 
268             forward_to_deserialize_any! {
269                 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str
270                 string bytes byte_buf option unit unit_struct newtype_struct seq
271                 tuple tuple_struct map struct enum identifier ignored_any
272             }
273 
274             fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
275             where
276                 V: de::Visitor<'de>,
277             {
278                 visitor.$method(self.value $($cast)*)
279             }
280         }
281 
282         impl<E> Debug for $name<E> {
283             fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
284                 formatter
285                     .debug_struct(stringify!($name))
286                     .field("value", &self.value)
287                     .finish()
288             }
289         }
290     }
291 }
292 
293 primitive_deserializer!(bool, "a `bool`.", BoolDeserializer, visit_bool);
294 primitive_deserializer!(i8, "an `i8`.", I8Deserializer, visit_i8);
295 primitive_deserializer!(i16, "an `i16`.", I16Deserializer, visit_i16);
296 primitive_deserializer!(i32, "an `i32`.", I32Deserializer, visit_i32);
297 primitive_deserializer!(i64, "an `i64`.", I64Deserializer, visit_i64);
298 primitive_deserializer!(i128, "an `i128`.", I128Deserializer, visit_i128);
299 primitive_deserializer!(isize, "an `isize`.", IsizeDeserializer, visit_i64 as i64);
300 primitive_deserializer!(u8, "a `u8`.", U8Deserializer, visit_u8);
301 primitive_deserializer!(u16, "a `u16`.", U16Deserializer, visit_u16);
302 primitive_deserializer!(u64, "a `u64`.", U64Deserializer, visit_u64);
303 primitive_deserializer!(u128, "a `u128`.", U128Deserializer, visit_u128);
304 primitive_deserializer!(usize, "a `usize`.", UsizeDeserializer, visit_u64 as u64);
305 primitive_deserializer!(f32, "an `f32`.", F32Deserializer, visit_f32);
306 primitive_deserializer!(f64, "an `f64`.", F64Deserializer, visit_f64);
307 primitive_deserializer!(char, "a `char`.", CharDeserializer, visit_char);
308 
309 /// A deserializer holding a `u32`.
310 pub struct U32Deserializer<E> {
311     value: u32,
312     marker: PhantomData<E>,
313 }
314 
315 impl_copy_clone!(U32Deserializer);
316 
317 impl<'de, E> IntoDeserializer<'de, E> for u32
318 where
319     E: de::Error,
320 {
321     type Deserializer = U32Deserializer<E>;
322 
into_deserializer(self) -> U32Deserializer<E>323     fn into_deserializer(self) -> U32Deserializer<E> {
324         U32Deserializer::new(self)
325     }
326 }
327 
328 impl<E> U32Deserializer<E> {
329     #[allow(missing_docs)]
new(value: u32) -> Self330     pub fn new(value: u32) -> Self {
331         U32Deserializer {
332             value,
333             marker: PhantomData,
334         }
335     }
336 }
337 
338 impl<'de, E> de::Deserializer<'de> for U32Deserializer<E>
339 where
340     E: de::Error,
341 {
342     type Error = E;
343 
344     forward_to_deserialize_any! {
345         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
346         bytes byte_buf option unit unit_struct newtype_struct seq tuple
347         tuple_struct map struct identifier ignored_any
348     }
349 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,350     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
351     where
352         V: de::Visitor<'de>,
353     {
354         visitor.visit_u32(self.value)
355     }
356 
deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,357     fn deserialize_enum<V>(
358         self,
359         name: &str,
360         variants: &'static [&'static str],
361         visitor: V,
362     ) -> Result<V::Value, Self::Error>
363     where
364         V: de::Visitor<'de>,
365     {
366         let _ = name;
367         let _ = variants;
368         visitor.visit_enum(self)
369     }
370 }
371 
372 impl<'de, E> de::EnumAccess<'de> for U32Deserializer<E>
373 where
374     E: de::Error,
375 {
376     type Error = E;
377     type Variant = private::UnitOnly<E>;
378 
variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,379     fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
380     where
381         T: de::DeserializeSeed<'de>,
382     {
383         seed.deserialize(self).map(private::unit_only)
384     }
385 }
386 
387 impl<E> Debug for U32Deserializer<E> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result388     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
389         formatter
390             .debug_struct("U32Deserializer")
391             .field("value", &self.value)
392             .finish()
393     }
394 }
395 
396 ////////////////////////////////////////////////////////////////////////////////
397 
398 /// A deserializer holding a `&str`.
399 pub struct StrDeserializer<'a, E> {
400     value: &'a str,
401     marker: PhantomData<E>,
402 }
403 
404 impl_copy_clone!(StrDeserializer<'de>);
405 
406 impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a str
407 where
408     E: de::Error,
409 {
410     type Deserializer = StrDeserializer<'a, E>;
411 
into_deserializer(self) -> StrDeserializer<'a, E>412     fn into_deserializer(self) -> StrDeserializer<'a, E> {
413         StrDeserializer::new(self)
414     }
415 }
416 
417 impl<'a, E> StrDeserializer<'a, E> {
418     #[allow(missing_docs)]
new(value: &'a str) -> Self419     pub fn new(value: &'a str) -> Self {
420         StrDeserializer {
421             value,
422             marker: PhantomData,
423         }
424     }
425 }
426 
427 impl<'de, 'a, E> de::Deserializer<'de> for StrDeserializer<'a, E>
428 where
429     E: de::Error,
430 {
431     type Error = E;
432 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,433     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
434     where
435         V: de::Visitor<'de>,
436     {
437         visitor.visit_str(self.value)
438     }
439 
deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,440     fn deserialize_enum<V>(
441         self,
442         name: &str,
443         variants: &'static [&'static str],
444         visitor: V,
445     ) -> Result<V::Value, Self::Error>
446     where
447         V: de::Visitor<'de>,
448     {
449         let _ = name;
450         let _ = variants;
451         visitor.visit_enum(self)
452     }
453 
454     forward_to_deserialize_any! {
455         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
456         bytes byte_buf option unit unit_struct newtype_struct seq tuple
457         tuple_struct map struct identifier ignored_any
458     }
459 }
460 
461 impl<'de, 'a, E> de::EnumAccess<'de> for StrDeserializer<'a, E>
462 where
463     E: de::Error,
464 {
465     type Error = E;
466     type Variant = private::UnitOnly<E>;
467 
variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,468     fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
469     where
470         T: de::DeserializeSeed<'de>,
471     {
472         seed.deserialize(self).map(private::unit_only)
473     }
474 }
475 
476 impl<'a, E> Debug for StrDeserializer<'a, E> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result477     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
478         formatter
479             .debug_struct("StrDeserializer")
480             .field("value", &self.value)
481             .finish()
482     }
483 }
484 
485 ////////////////////////////////////////////////////////////////////////////////
486 
487 /// A deserializer holding a `&str` with a lifetime tied to another
488 /// deserializer.
489 pub struct BorrowedStrDeserializer<'de, E> {
490     value: &'de str,
491     marker: PhantomData<E>,
492 }
493 
494 impl_copy_clone!(BorrowedStrDeserializer<'de>);
495 
496 impl<'de, E> BorrowedStrDeserializer<'de, E> {
497     /// Create a new borrowed deserializer from the given string.
new(value: &'de str) -> BorrowedStrDeserializer<'de, E>498     pub fn new(value: &'de str) -> BorrowedStrDeserializer<'de, E> {
499         BorrowedStrDeserializer {
500             value,
501             marker: PhantomData,
502         }
503     }
504 }
505 
506 impl<'de, E> de::Deserializer<'de> for BorrowedStrDeserializer<'de, E>
507 where
508     E: de::Error,
509 {
510     type Error = E;
511 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,512     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
513     where
514         V: de::Visitor<'de>,
515     {
516         visitor.visit_borrowed_str(self.value)
517     }
518 
deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,519     fn deserialize_enum<V>(
520         self,
521         name: &str,
522         variants: &'static [&'static str],
523         visitor: V,
524     ) -> Result<V::Value, Self::Error>
525     where
526         V: de::Visitor<'de>,
527     {
528         let _ = name;
529         let _ = variants;
530         visitor.visit_enum(self)
531     }
532 
533     forward_to_deserialize_any! {
534         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
535         bytes byte_buf option unit unit_struct newtype_struct seq tuple
536         tuple_struct map struct identifier ignored_any
537     }
538 }
539 
540 impl<'de, E> de::EnumAccess<'de> for BorrowedStrDeserializer<'de, E>
541 where
542     E: de::Error,
543 {
544     type Error = E;
545     type Variant = private::UnitOnly<E>;
546 
variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,547     fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
548     where
549         T: de::DeserializeSeed<'de>,
550     {
551         seed.deserialize(self).map(private::unit_only)
552     }
553 }
554 
555 impl<'de, E> Debug for BorrowedStrDeserializer<'de, E> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result556     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
557         formatter
558             .debug_struct("BorrowedStrDeserializer")
559             .field("value", &self.value)
560             .finish()
561     }
562 }
563 
564 ////////////////////////////////////////////////////////////////////////////////
565 
566 /// A deserializer holding a `String`.
567 #[cfg(any(feature = "std", feature = "alloc"))]
568 #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))]
569 pub struct StringDeserializer<E> {
570     value: String,
571     marker: PhantomData<E>,
572 }
573 
574 #[cfg(any(feature = "std", feature = "alloc"))]
575 impl<E> Clone for StringDeserializer<E> {
clone(&self) -> Self576     fn clone(&self) -> Self {
577         StringDeserializer {
578             value: self.value.clone(),
579             marker: PhantomData,
580         }
581     }
582 }
583 
584 #[cfg(any(feature = "std", feature = "alloc"))]
585 #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))]
586 impl<'de, E> IntoDeserializer<'de, E> for String
587 where
588     E: de::Error,
589 {
590     type Deserializer = StringDeserializer<E>;
591 
into_deserializer(self) -> StringDeserializer<E>592     fn into_deserializer(self) -> StringDeserializer<E> {
593         StringDeserializer::new(self)
594     }
595 }
596 
597 #[cfg(any(feature = "std", feature = "alloc"))]
598 impl<E> StringDeserializer<E> {
599     #[allow(missing_docs)]
new(value: String) -> Self600     pub fn new(value: String) -> Self {
601         StringDeserializer {
602             value,
603             marker: PhantomData,
604         }
605     }
606 }
607 
608 #[cfg(any(feature = "std", feature = "alloc"))]
609 impl<'de, E> de::Deserializer<'de> for StringDeserializer<E>
610 where
611     E: de::Error,
612 {
613     type Error = E;
614 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,615     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
616     where
617         V: de::Visitor<'de>,
618     {
619         visitor.visit_string(self.value)
620     }
621 
deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,622     fn deserialize_enum<V>(
623         self,
624         name: &str,
625         variants: &'static [&'static str],
626         visitor: V,
627     ) -> Result<V::Value, Self::Error>
628     where
629         V: de::Visitor<'de>,
630     {
631         let _ = name;
632         let _ = variants;
633         visitor.visit_enum(self)
634     }
635 
636     forward_to_deserialize_any! {
637         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
638         bytes byte_buf option unit unit_struct newtype_struct seq tuple
639         tuple_struct map struct identifier ignored_any
640     }
641 }
642 
643 #[cfg(any(feature = "std", feature = "alloc"))]
644 impl<'de, E> de::EnumAccess<'de> for StringDeserializer<E>
645 where
646     E: de::Error,
647 {
648     type Error = E;
649     type Variant = private::UnitOnly<E>;
650 
variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,651     fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
652     where
653         T: de::DeserializeSeed<'de>,
654     {
655         seed.deserialize(self).map(private::unit_only)
656     }
657 }
658 
659 #[cfg(any(feature = "std", feature = "alloc"))]
660 impl<E> Debug for StringDeserializer<E> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result661     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
662         formatter
663             .debug_struct("StringDeserializer")
664             .field("value", &self.value)
665             .finish()
666     }
667 }
668 
669 ////////////////////////////////////////////////////////////////////////////////
670 
671 /// A deserializer holding a `Cow<str>`.
672 #[cfg(any(feature = "std", feature = "alloc"))]
673 #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))]
674 pub struct CowStrDeserializer<'a, E> {
675     value: Cow<'a, str>,
676     marker: PhantomData<E>,
677 }
678 
679 #[cfg(any(feature = "std", feature = "alloc"))]
680 impl<'a, E> Clone for CowStrDeserializer<'a, E> {
clone(&self) -> Self681     fn clone(&self) -> Self {
682         CowStrDeserializer {
683             value: self.value.clone(),
684             marker: PhantomData,
685         }
686     }
687 }
688 
689 #[cfg(any(feature = "std", feature = "alloc"))]
690 #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))]
691 impl<'de, 'a, E> IntoDeserializer<'de, E> for Cow<'a, str>
692 where
693     E: de::Error,
694 {
695     type Deserializer = CowStrDeserializer<'a, E>;
696 
into_deserializer(self) -> CowStrDeserializer<'a, E>697     fn into_deserializer(self) -> CowStrDeserializer<'a, E> {
698         CowStrDeserializer::new(self)
699     }
700 }
701 
702 #[cfg(any(feature = "std", feature = "alloc"))]
703 impl<'a, E> CowStrDeserializer<'a, E> {
704     #[allow(missing_docs)]
new(value: Cow<'a, str>) -> Self705     pub fn new(value: Cow<'a, str>) -> Self {
706         CowStrDeserializer {
707             value,
708             marker: PhantomData,
709         }
710     }
711 }
712 
713 #[cfg(any(feature = "std", feature = "alloc"))]
714 impl<'de, 'a, E> de::Deserializer<'de> for CowStrDeserializer<'a, E>
715 where
716     E: de::Error,
717 {
718     type Error = E;
719 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,720     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
721     where
722         V: de::Visitor<'de>,
723     {
724         match self.value {
725             Cow::Borrowed(string) => visitor.visit_str(string),
726             Cow::Owned(string) => visitor.visit_string(string),
727         }
728     }
729 
deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,730     fn deserialize_enum<V>(
731         self,
732         name: &str,
733         variants: &'static [&'static str],
734         visitor: V,
735     ) -> Result<V::Value, Self::Error>
736     where
737         V: de::Visitor<'de>,
738     {
739         let _ = name;
740         let _ = variants;
741         visitor.visit_enum(self)
742     }
743 
744     forward_to_deserialize_any! {
745         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
746         bytes byte_buf option unit unit_struct newtype_struct seq tuple
747         tuple_struct map struct identifier ignored_any
748     }
749 }
750 
751 #[cfg(any(feature = "std", feature = "alloc"))]
752 impl<'de, 'a, E> de::EnumAccess<'de> for CowStrDeserializer<'a, E>
753 where
754     E: de::Error,
755 {
756     type Error = E;
757     type Variant = private::UnitOnly<E>;
758 
variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,759     fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
760     where
761         T: de::DeserializeSeed<'de>,
762     {
763         seed.deserialize(self).map(private::unit_only)
764     }
765 }
766 
767 #[cfg(any(feature = "std", feature = "alloc"))]
768 impl<'a, E> Debug for CowStrDeserializer<'a, E> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result769     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
770         formatter
771             .debug_struct("CowStrDeserializer")
772             .field("value", &self.value)
773             .finish()
774     }
775 }
776 
777 ////////////////////////////////////////////////////////////////////////////////
778 
779 /// A deserializer holding a `&[u8]`. Always calls [`Visitor::visit_bytes`].
780 pub struct BytesDeserializer<'a, E> {
781     value: &'a [u8],
782     marker: PhantomData<E>,
783 }
784 
785 impl<'a, E> BytesDeserializer<'a, E> {
786     /// Create a new deserializer from the given bytes.
new(value: &'a [u8]) -> Self787     pub fn new(value: &'a [u8]) -> Self {
788         BytesDeserializer {
789             value,
790             marker: PhantomData,
791         }
792     }
793 }
794 
795 impl_copy_clone!(BytesDeserializer<'a>);
796 
797 impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a [u8]
798 where
799     E: de::Error,
800 {
801     type Deserializer = BytesDeserializer<'a, E>;
802 
into_deserializer(self) -> BytesDeserializer<'a, E>803     fn into_deserializer(self) -> BytesDeserializer<'a, E> {
804         BytesDeserializer::new(self)
805     }
806 }
807 
808 impl<'de, 'a, E> Deserializer<'de> for BytesDeserializer<'a, E>
809 where
810     E: de::Error,
811 {
812     type Error = E;
813 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,814     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
815     where
816         V: Visitor<'de>,
817     {
818         visitor.visit_bytes(self.value)
819     }
820 
821     forward_to_deserialize_any! {
822         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
823         bytes byte_buf option unit unit_struct newtype_struct seq tuple
824         tuple_struct map struct enum identifier ignored_any
825     }
826 }
827 
828 impl<'a, E> Debug for BytesDeserializer<'a, E> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result829     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
830         formatter
831             .debug_struct("BytesDeserializer")
832             .field("value", &self.value)
833             .finish()
834     }
835 }
836 
837 /// A deserializer holding a `&[u8]` with a lifetime tied to another
838 /// deserializer. Always calls [`Visitor::visit_borrowed_bytes`].
839 pub struct BorrowedBytesDeserializer<'de, E> {
840     value: &'de [u8],
841     marker: PhantomData<E>,
842 }
843 
844 impl<'de, E> BorrowedBytesDeserializer<'de, E> {
845     /// Create a new borrowed deserializer from the given borrowed bytes.
new(value: &'de [u8]) -> Self846     pub fn new(value: &'de [u8]) -> Self {
847         BorrowedBytesDeserializer {
848             value,
849             marker: PhantomData,
850         }
851     }
852 }
853 
854 impl_copy_clone!(BorrowedBytesDeserializer<'de>);
855 
856 impl<'de, E> Deserializer<'de> for BorrowedBytesDeserializer<'de, E>
857 where
858     E: de::Error,
859 {
860     type Error = E;
861 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,862     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
863     where
864         V: Visitor<'de>,
865     {
866         visitor.visit_borrowed_bytes(self.value)
867     }
868 
869     forward_to_deserialize_any! {
870         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
871         bytes byte_buf option unit unit_struct newtype_struct seq tuple
872         tuple_struct map struct enum identifier ignored_any
873     }
874 }
875 
876 impl<'de, E> Debug for BorrowedBytesDeserializer<'de, E> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result877     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
878         formatter
879             .debug_struct("BorrowedBytesDeserializer")
880             .field("value", &self.value)
881             .finish()
882     }
883 }
884 
885 ////////////////////////////////////////////////////////////////////////////////
886 
887 /// A deserializer that iterates over a sequence.
888 #[derive(Clone)]
889 pub struct SeqDeserializer<I, E> {
890     iter: iter::Fuse<I>,
891     count: usize,
892     marker: PhantomData<E>,
893 }
894 
895 impl<I, E> SeqDeserializer<I, E>
896 where
897     I: Iterator,
898 {
899     /// Construct a new `SeqDeserializer<I, E>`.
new(iter: I) -> Self900     pub fn new(iter: I) -> Self {
901         SeqDeserializer {
902             iter: iter.fuse(),
903             count: 0,
904             marker: PhantomData,
905         }
906     }
907 }
908 
909 impl<I, E> SeqDeserializer<I, E>
910 where
911     I: Iterator,
912     E: de::Error,
913 {
914     /// Check for remaining elements after passing a `SeqDeserializer` to
915     /// `Visitor::visit_seq`.
end(self) -> Result<(), E>916     pub fn end(self) -> Result<(), E> {
917         let remaining = self.iter.count();
918         if remaining == 0 {
919             Ok(())
920         } else {
921             // First argument is the number of elements in the data, second
922             // argument is the number of elements expected by the Deserialize.
923             Err(de::Error::invalid_length(
924                 self.count + remaining,
925                 &ExpectedInSeq(self.count),
926             ))
927         }
928     }
929 }
930 
931 impl<'de, I, T, E> de::Deserializer<'de> for SeqDeserializer<I, E>
932 where
933     I: Iterator<Item = T>,
934     T: IntoDeserializer<'de, E>,
935     E: de::Error,
936 {
937     type Error = E;
938 
deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,939     fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
940     where
941         V: de::Visitor<'de>,
942     {
943         let v = tri!(visitor.visit_seq(&mut self));
944         tri!(self.end());
945         Ok(v)
946     }
947 
948     forward_to_deserialize_any! {
949         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
950         bytes byte_buf option unit unit_struct newtype_struct seq tuple
951         tuple_struct map struct enum identifier ignored_any
952     }
953 }
954 
955 impl<'de, I, T, E> de::SeqAccess<'de> for SeqDeserializer<I, E>
956 where
957     I: Iterator<Item = T>,
958     T: IntoDeserializer<'de, E>,
959     E: de::Error,
960 {
961     type Error = E;
962 
next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error> where V: de::DeserializeSeed<'de>,963     fn next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error>
964     where
965         V: de::DeserializeSeed<'de>,
966     {
967         match self.iter.next() {
968             Some(value) => {
969                 self.count += 1;
970                 seed.deserialize(value.into_deserializer()).map(Some)
971             }
972             None => Ok(None),
973         }
974     }
975 
size_hint(&self) -> Option<usize>976     fn size_hint(&self) -> Option<usize> {
977         size_hint::from_bounds(&self.iter)
978     }
979 }
980 
981 struct ExpectedInSeq(usize);
982 
983 impl Expected for ExpectedInSeq {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result984     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
985         if self.0 == 1 {
986             write!(formatter, "1 element in sequence")
987         } else {
988             write!(formatter, "{} elements in sequence", self.0)
989         }
990     }
991 }
992 
993 impl<I, E> Debug for SeqDeserializer<I, E>
994 where
995     I: Debug,
996 {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result997     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
998         formatter
999             .debug_struct("SeqDeserializer")
1000             .field("iter", &self.iter)
1001             .field("count", &self.count)
1002             .finish()
1003     }
1004 }
1005 
1006 ////////////////////////////////////////////////////////////////////////////////
1007 
1008 #[cfg(any(feature = "std", feature = "alloc"))]
1009 #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))]
1010 impl<'de, T, E> IntoDeserializer<'de, E> for Vec<T>
1011 where
1012     T: IntoDeserializer<'de, E>,
1013     E: de::Error,
1014 {
1015     type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;
1016 
into_deserializer(self) -> Self::Deserializer1017     fn into_deserializer(self) -> Self::Deserializer {
1018         SeqDeserializer::new(self.into_iter())
1019     }
1020 }
1021 
1022 #[cfg(any(feature = "std", feature = "alloc"))]
1023 #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))]
1024 impl<'de, T, E> IntoDeserializer<'de, E> for BTreeSet<T>
1025 where
1026     T: IntoDeserializer<'de, E> + Eq + Ord,
1027     E: de::Error,
1028 {
1029     type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;
1030 
into_deserializer(self) -> Self::Deserializer1031     fn into_deserializer(self) -> Self::Deserializer {
1032         SeqDeserializer::new(self.into_iter())
1033     }
1034 }
1035 
1036 #[cfg(feature = "std")]
1037 #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))]
1038 impl<'de, T, S, E> IntoDeserializer<'de, E> for HashSet<T, S>
1039 where
1040     T: IntoDeserializer<'de, E> + Eq + Hash,
1041     S: BuildHasher,
1042     E: de::Error,
1043 {
1044     type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;
1045 
into_deserializer(self) -> Self::Deserializer1046     fn into_deserializer(self) -> Self::Deserializer {
1047         SeqDeserializer::new(self.into_iter())
1048     }
1049 }
1050 
1051 ////////////////////////////////////////////////////////////////////////////////
1052 
1053 /// A deserializer holding a `SeqAccess`.
1054 #[derive(Clone, Debug)]
1055 pub struct SeqAccessDeserializer<A> {
1056     seq: A,
1057 }
1058 
1059 impl<A> SeqAccessDeserializer<A> {
1060     /// Construct a new `SeqAccessDeserializer<A>`.
new(seq: A) -> Self1061     pub fn new(seq: A) -> Self {
1062         SeqAccessDeserializer { seq }
1063     }
1064 }
1065 
1066 impl<'de, A> de::Deserializer<'de> for SeqAccessDeserializer<A>
1067 where
1068     A: de::SeqAccess<'de>,
1069 {
1070     type Error = A::Error;
1071 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1072     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1073     where
1074         V: de::Visitor<'de>,
1075     {
1076         visitor.visit_seq(self.seq)
1077     }
1078 
1079     forward_to_deserialize_any! {
1080         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1081         bytes byte_buf option unit unit_struct newtype_struct seq tuple
1082         tuple_struct map struct enum identifier ignored_any
1083     }
1084 }
1085 
1086 ////////////////////////////////////////////////////////////////////////////////
1087 
1088 /// A deserializer that iterates over a map.
1089 pub struct MapDeserializer<'de, I, E>
1090 where
1091     I: Iterator,
1092     I::Item: private::Pair,
1093 {
1094     iter: iter::Fuse<I>,
1095     value: Option<Second<I::Item>>,
1096     count: usize,
1097     lifetime: PhantomData<&'de ()>,
1098     error: PhantomData<E>,
1099 }
1100 
1101 impl<'de, I, E> MapDeserializer<'de, I, E>
1102 where
1103     I: Iterator,
1104     I::Item: private::Pair,
1105 {
1106     /// Construct a new `MapDeserializer<I, E>`.
new(iter: I) -> Self1107     pub fn new(iter: I) -> Self {
1108         MapDeserializer {
1109             iter: iter.fuse(),
1110             value: None,
1111             count: 0,
1112             lifetime: PhantomData,
1113             error: PhantomData,
1114         }
1115     }
1116 }
1117 
1118 impl<'de, I, E> MapDeserializer<'de, I, E>
1119 where
1120     I: Iterator,
1121     I::Item: private::Pair,
1122     E: de::Error,
1123 {
1124     /// Check for remaining elements after passing a `MapDeserializer` to
1125     /// `Visitor::visit_map`.
end(self) -> Result<(), E>1126     pub fn end(self) -> Result<(), E> {
1127         let remaining = self.iter.count();
1128         if remaining == 0 {
1129             Ok(())
1130         } else {
1131             // First argument is the number of elements in the data, second
1132             // argument is the number of elements expected by the Deserialize.
1133             Err(de::Error::invalid_length(
1134                 self.count + remaining,
1135                 &ExpectedInMap(self.count),
1136             ))
1137         }
1138     }
1139 }
1140 
1141 impl<'de, I, E> MapDeserializer<'de, I, E>
1142 where
1143     I: Iterator,
1144     I::Item: private::Pair,
1145 {
next_pair(&mut self) -> Option<(First<I::Item>, Second<I::Item>)>1146     fn next_pair(&mut self) -> Option<(First<I::Item>, Second<I::Item>)> {
1147         match self.iter.next() {
1148             Some(kv) => {
1149                 self.count += 1;
1150                 Some(private::Pair::split(kv))
1151             }
1152             None => None,
1153         }
1154     }
1155 }
1156 
1157 impl<'de, I, E> de::Deserializer<'de> for MapDeserializer<'de, I, E>
1158 where
1159     I: Iterator,
1160     I::Item: private::Pair,
1161     First<I::Item>: IntoDeserializer<'de, E>,
1162     Second<I::Item>: IntoDeserializer<'de, E>,
1163     E: de::Error,
1164 {
1165     type Error = E;
1166 
deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1167     fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1168     where
1169         V: de::Visitor<'de>,
1170     {
1171         let value = tri!(visitor.visit_map(&mut self));
1172         tri!(self.end());
1173         Ok(value)
1174     }
1175 
deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1176     fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1177     where
1178         V: de::Visitor<'de>,
1179     {
1180         let value = tri!(visitor.visit_seq(&mut self));
1181         tri!(self.end());
1182         Ok(value)
1183     }
1184 
deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1185     fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1186     where
1187         V: de::Visitor<'de>,
1188     {
1189         let _ = len;
1190         self.deserialize_seq(visitor)
1191     }
1192 
1193     forward_to_deserialize_any! {
1194         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1195         bytes byte_buf option unit unit_struct newtype_struct tuple_struct map
1196         struct enum identifier ignored_any
1197     }
1198 }
1199 
1200 impl<'de, I, E> de::MapAccess<'de> for MapDeserializer<'de, I, E>
1201 where
1202     I: Iterator,
1203     I::Item: private::Pair,
1204     First<I::Item>: IntoDeserializer<'de, E>,
1205     Second<I::Item>: IntoDeserializer<'de, E>,
1206     E: de::Error,
1207 {
1208     type Error = E;
1209 
next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed<'de>,1210     fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1211     where
1212         T: de::DeserializeSeed<'de>,
1213     {
1214         match self.next_pair() {
1215             Some((key, value)) => {
1216                 self.value = Some(value);
1217                 seed.deserialize(key.into_deserializer()).map(Some)
1218             }
1219             None => Ok(None),
1220         }
1221     }
1222 
next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> where T: de::DeserializeSeed<'de>,1223     fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
1224     where
1225         T: de::DeserializeSeed<'de>,
1226     {
1227         let value = self.value.take();
1228         // Panic because this indicates a bug in the program rather than an
1229         // expected failure.
1230         let value = value.expect("MapAccess::next_value called before next_key");
1231         seed.deserialize(value.into_deserializer())
1232     }
1233 
next_entry_seed<TK, TV>( &mut self, kseed: TK, vseed: TV, ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error> where TK: de::DeserializeSeed<'de>, TV: de::DeserializeSeed<'de>,1234     fn next_entry_seed<TK, TV>(
1235         &mut self,
1236         kseed: TK,
1237         vseed: TV,
1238     ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error>
1239     where
1240         TK: de::DeserializeSeed<'de>,
1241         TV: de::DeserializeSeed<'de>,
1242     {
1243         match self.next_pair() {
1244             Some((key, value)) => {
1245                 let key = tri!(kseed.deserialize(key.into_deserializer()));
1246                 let value = tri!(vseed.deserialize(value.into_deserializer()));
1247                 Ok(Some((key, value)))
1248             }
1249             None => Ok(None),
1250         }
1251     }
1252 
size_hint(&self) -> Option<usize>1253     fn size_hint(&self) -> Option<usize> {
1254         size_hint::from_bounds(&self.iter)
1255     }
1256 }
1257 
1258 impl<'de, I, E> de::SeqAccess<'de> for MapDeserializer<'de, I, E>
1259 where
1260     I: Iterator,
1261     I::Item: private::Pair,
1262     First<I::Item>: IntoDeserializer<'de, E>,
1263     Second<I::Item>: IntoDeserializer<'de, E>,
1264     E: de::Error,
1265 {
1266     type Error = E;
1267 
next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed<'de>,1268     fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1269     where
1270         T: de::DeserializeSeed<'de>,
1271     {
1272         match self.next_pair() {
1273             Some((k, v)) => {
1274                 let de = PairDeserializer(k, v, PhantomData);
1275                 seed.deserialize(de).map(Some)
1276             }
1277             None => Ok(None),
1278         }
1279     }
1280 
size_hint(&self) -> Option<usize>1281     fn size_hint(&self) -> Option<usize> {
1282         size_hint::from_bounds(&self.iter)
1283     }
1284 }
1285 
1286 // Cannot #[derive(Clone)] because of the bound `Second<I::Item>: Clone`.
1287 impl<'de, I, E> Clone for MapDeserializer<'de, I, E>
1288 where
1289     I: Iterator + Clone,
1290     I::Item: private::Pair,
1291     Second<I::Item>: Clone,
1292 {
clone(&self) -> Self1293     fn clone(&self) -> Self {
1294         MapDeserializer {
1295             iter: self.iter.clone(),
1296             value: self.value.clone(),
1297             count: self.count,
1298             lifetime: self.lifetime,
1299             error: self.error,
1300         }
1301     }
1302 }
1303 
1304 impl<'de, I, E> Debug for MapDeserializer<'de, I, E>
1305 where
1306     I: Iterator + Debug,
1307     I::Item: private::Pair,
1308     Second<I::Item>: Debug,
1309 {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result1310     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1311         formatter
1312             .debug_struct("MapDeserializer")
1313             .field("iter", &self.iter)
1314             .field("value", &self.value)
1315             .field("count", &self.count)
1316             .finish()
1317     }
1318 }
1319 
1320 // Used in the `impl SeqAccess for MapDeserializer` to visit the map as a
1321 // sequence of pairs.
1322 struct PairDeserializer<A, B, E>(A, B, PhantomData<E>);
1323 
1324 impl<'de, A, B, E> de::Deserializer<'de> for PairDeserializer<A, B, E>
1325 where
1326     A: IntoDeserializer<'de, E>,
1327     B: IntoDeserializer<'de, E>,
1328     E: de::Error,
1329 {
1330     type Error = E;
1331 
1332     forward_to_deserialize_any! {
1333         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1334         bytes byte_buf option unit unit_struct newtype_struct tuple_struct map
1335         struct enum identifier ignored_any
1336     }
1337 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1338     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1339     where
1340         V: de::Visitor<'de>,
1341     {
1342         self.deserialize_seq(visitor)
1343     }
1344 
deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1345     fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1346     where
1347         V: de::Visitor<'de>,
1348     {
1349         let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData);
1350         let pair = tri!(visitor.visit_seq(&mut pair_visitor));
1351         if pair_visitor.1.is_none() {
1352             Ok(pair)
1353         } else {
1354             let remaining = pair_visitor.size_hint().unwrap();
1355             // First argument is the number of elements in the data, second
1356             // argument is the number of elements expected by the Deserialize.
1357             Err(de::Error::invalid_length(2, &ExpectedInSeq(2 - remaining)))
1358         }
1359     }
1360 
deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1361     fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1362     where
1363         V: de::Visitor<'de>,
1364     {
1365         if len == 2 {
1366             self.deserialize_seq(visitor)
1367         } else {
1368             // First argument is the number of elements in the data, second
1369             // argument is the number of elements expected by the Deserialize.
1370             Err(de::Error::invalid_length(2, &ExpectedInSeq(len)))
1371         }
1372     }
1373 }
1374 
1375 struct PairVisitor<A, B, E>(Option<A>, Option<B>, PhantomData<E>);
1376 
1377 impl<'de, A, B, E> de::SeqAccess<'de> for PairVisitor<A, B, E>
1378 where
1379     A: IntoDeserializer<'de, E>,
1380     B: IntoDeserializer<'de, E>,
1381     E: de::Error,
1382 {
1383     type Error = E;
1384 
next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed<'de>,1385     fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1386     where
1387         T: de::DeserializeSeed<'de>,
1388     {
1389         if let Some(k) = self.0.take() {
1390             seed.deserialize(k.into_deserializer()).map(Some)
1391         } else if let Some(v) = self.1.take() {
1392             seed.deserialize(v.into_deserializer()).map(Some)
1393         } else {
1394             Ok(None)
1395         }
1396     }
1397 
size_hint(&self) -> Option<usize>1398     fn size_hint(&self) -> Option<usize> {
1399         if self.0.is_some() {
1400             Some(2)
1401         } else if self.1.is_some() {
1402             Some(1)
1403         } else {
1404             Some(0)
1405         }
1406     }
1407 }
1408 
1409 struct ExpectedInMap(usize);
1410 
1411 impl Expected for ExpectedInMap {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result1412     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1413         if self.0 == 1 {
1414             write!(formatter, "1 element in map")
1415         } else {
1416             write!(formatter, "{} elements in map", self.0)
1417         }
1418     }
1419 }
1420 
1421 ////////////////////////////////////////////////////////////////////////////////
1422 
1423 #[cfg(any(feature = "std", feature = "alloc"))]
1424 #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))]
1425 impl<'de, K, V, E> IntoDeserializer<'de, E> for BTreeMap<K, V>
1426 where
1427     K: IntoDeserializer<'de, E> + Eq + Ord,
1428     V: IntoDeserializer<'de, E>,
1429     E: de::Error,
1430 {
1431     type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>;
1432 
into_deserializer(self) -> Self::Deserializer1433     fn into_deserializer(self) -> Self::Deserializer {
1434         MapDeserializer::new(self.into_iter())
1435     }
1436 }
1437 
1438 #[cfg(feature = "std")]
1439 #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))]
1440 impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S>
1441 where
1442     K: IntoDeserializer<'de, E> + Eq + Hash,
1443     V: IntoDeserializer<'de, E>,
1444     S: BuildHasher,
1445     E: de::Error,
1446 {
1447     type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>;
1448 
into_deserializer(self) -> Self::Deserializer1449     fn into_deserializer(self) -> Self::Deserializer {
1450         MapDeserializer::new(self.into_iter())
1451     }
1452 }
1453 
1454 ////////////////////////////////////////////////////////////////////////////////
1455 
1456 /// A deserializer holding a `MapAccess`.
1457 #[derive(Clone, Debug)]
1458 pub struct MapAccessDeserializer<A> {
1459     map: A,
1460 }
1461 
1462 impl<A> MapAccessDeserializer<A> {
1463     /// Construct a new `MapAccessDeserializer<A>`.
new(map: A) -> Self1464     pub fn new(map: A) -> Self {
1465         MapAccessDeserializer { map }
1466     }
1467 }
1468 
1469 impl<'de, A> de::Deserializer<'de> for MapAccessDeserializer<A>
1470 where
1471     A: de::MapAccess<'de>,
1472 {
1473     type Error = A::Error;
1474 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1475     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1476     where
1477         V: de::Visitor<'de>,
1478     {
1479         visitor.visit_map(self.map)
1480     }
1481 
deserialize_enum<V>( self, _name: &str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1482     fn deserialize_enum<V>(
1483         self,
1484         _name: &str,
1485         _variants: &'static [&'static str],
1486         visitor: V,
1487     ) -> Result<V::Value, Self::Error>
1488     where
1489         V: de::Visitor<'de>,
1490     {
1491         visitor.visit_enum(self)
1492     }
1493 
1494     forward_to_deserialize_any! {
1495         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1496         bytes byte_buf option unit unit_struct newtype_struct seq tuple
1497         tuple_struct map struct identifier ignored_any
1498     }
1499 }
1500 
1501 impl<'de, A> de::EnumAccess<'de> for MapAccessDeserializer<A>
1502 where
1503     A: de::MapAccess<'de>,
1504 {
1505     type Error = A::Error;
1506     type Variant = private::MapAsEnum<A>;
1507 
variant_seed<T>(mut self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,1508     fn variant_seed<T>(mut self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
1509     where
1510         T: de::DeserializeSeed<'de>,
1511     {
1512         match tri!(self.map.next_key_seed(seed)) {
1513             Some(key) => Ok((key, private::map_as_enum(self.map))),
1514             None => Err(de::Error::invalid_type(de::Unexpected::Map, &"enum")),
1515         }
1516     }
1517 }
1518 
1519 ////////////////////////////////////////////////////////////////////////////////
1520 
1521 /// A deserializer holding an `EnumAccess`.
1522 #[derive(Clone, Debug)]
1523 pub struct EnumAccessDeserializer<A> {
1524     access: A,
1525 }
1526 
1527 impl<A> EnumAccessDeserializer<A> {
1528     /// Construct a new `EnumAccessDeserializer<A>`.
new(access: A) -> Self1529     pub fn new(access: A) -> Self {
1530         EnumAccessDeserializer { access }
1531     }
1532 }
1533 
1534 impl<'de, A> de::Deserializer<'de> for EnumAccessDeserializer<A>
1535 where
1536     A: de::EnumAccess<'de>,
1537 {
1538     type Error = A::Error;
1539 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1540     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1541     where
1542         V: de::Visitor<'de>,
1543     {
1544         visitor.visit_enum(self.access)
1545     }
1546 
1547     forward_to_deserialize_any! {
1548         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1549         bytes byte_buf option unit unit_struct newtype_struct seq tuple
1550         tuple_struct map struct enum identifier ignored_any
1551     }
1552 }
1553 
1554 ////////////////////////////////////////////////////////////////////////////////
1555 
1556 mod private {
1557     use crate::lib::*;
1558 
1559     use crate::de::{
1560         self, DeserializeSeed, Deserializer, MapAccess, Unexpected, VariantAccess, Visitor,
1561     };
1562 
1563     pub struct UnitOnly<E> {
1564         marker: PhantomData<E>,
1565     }
1566 
unit_only<T, E>(t: T) -> (T, UnitOnly<E>)1567     pub fn unit_only<T, E>(t: T) -> (T, UnitOnly<E>) {
1568         (
1569             t,
1570             UnitOnly {
1571                 marker: PhantomData,
1572             },
1573         )
1574     }
1575 
1576     impl<'de, E> de::VariantAccess<'de> for UnitOnly<E>
1577     where
1578         E: de::Error,
1579     {
1580         type Error = E;
1581 
unit_variant(self) -> Result<(), Self::Error>1582         fn unit_variant(self) -> Result<(), Self::Error> {
1583             Ok(())
1584         }
1585 
newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error> where T: de::DeserializeSeed<'de>,1586         fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>
1587         where
1588             T: de::DeserializeSeed<'de>,
1589         {
1590             Err(de::Error::invalid_type(
1591                 Unexpected::UnitVariant,
1592                 &"newtype variant",
1593             ))
1594         }
1595 
tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1596         fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>
1597         where
1598             V: de::Visitor<'de>,
1599         {
1600             Err(de::Error::invalid_type(
1601                 Unexpected::UnitVariant,
1602                 &"tuple variant",
1603             ))
1604         }
1605 
struct_variant<V>( self, _fields: &'static [&'static str], _visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1606         fn struct_variant<V>(
1607             self,
1608             _fields: &'static [&'static str],
1609             _visitor: V,
1610         ) -> Result<V::Value, Self::Error>
1611         where
1612             V: de::Visitor<'de>,
1613         {
1614             Err(de::Error::invalid_type(
1615                 Unexpected::UnitVariant,
1616                 &"struct variant",
1617             ))
1618         }
1619     }
1620 
1621     pub struct MapAsEnum<A> {
1622         map: A,
1623     }
1624 
map_as_enum<A>(map: A) -> MapAsEnum<A>1625     pub fn map_as_enum<A>(map: A) -> MapAsEnum<A> {
1626         MapAsEnum { map }
1627     }
1628 
1629     impl<'de, A> VariantAccess<'de> for MapAsEnum<A>
1630     where
1631         A: MapAccess<'de>,
1632     {
1633         type Error = A::Error;
1634 
unit_variant(mut self) -> Result<(), Self::Error>1635         fn unit_variant(mut self) -> Result<(), Self::Error> {
1636             self.map.next_value()
1637         }
1638 
newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error> where T: DeserializeSeed<'de>,1639         fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error>
1640         where
1641             T: DeserializeSeed<'de>,
1642         {
1643             self.map.next_value_seed(seed)
1644         }
1645 
tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,1646         fn tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1647         where
1648             V: Visitor<'de>,
1649         {
1650             self.map.next_value_seed(SeedTupleVariant { len, visitor })
1651         }
1652 
struct_variant<V>( mut self, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: Visitor<'de>,1653         fn struct_variant<V>(
1654             mut self,
1655             _fields: &'static [&'static str],
1656             visitor: V,
1657         ) -> Result<V::Value, Self::Error>
1658         where
1659             V: Visitor<'de>,
1660         {
1661             self.map.next_value_seed(SeedStructVariant { visitor })
1662         }
1663     }
1664 
1665     struct SeedTupleVariant<V> {
1666         len: usize,
1667         visitor: V,
1668     }
1669 
1670     impl<'de, V> DeserializeSeed<'de> for SeedTupleVariant<V>
1671     where
1672         V: Visitor<'de>,
1673     {
1674         type Value = V::Value;
1675 
deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,1676         fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1677         where
1678             D: Deserializer<'de>,
1679         {
1680             deserializer.deserialize_tuple(self.len, self.visitor)
1681         }
1682     }
1683 
1684     struct SeedStructVariant<V> {
1685         visitor: V,
1686     }
1687 
1688     impl<'de, V> DeserializeSeed<'de> for SeedStructVariant<V>
1689     where
1690         V: Visitor<'de>,
1691     {
1692         type Value = V::Value;
1693 
deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,1694         fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1695         where
1696             D: Deserializer<'de>,
1697         {
1698             deserializer.deserialize_map(self.visitor)
1699         }
1700     }
1701 
1702     /// Avoid having to restate the generic types on `MapDeserializer`. The
1703     /// `Iterator::Item` contains enough information to figure out K and V.
1704     pub trait Pair {
1705         type First;
1706         type Second;
split(self) -> (Self::First, Self::Second)1707         fn split(self) -> (Self::First, Self::Second);
1708     }
1709 
1710     impl<A, B> Pair for (A, B) {
1711         type First = A;
1712         type Second = B;
split(self) -> (A, B)1713         fn split(self) -> (A, B) {
1714             self
1715         }
1716     }
1717 
1718     pub type First<T> = <T as Pair>::First;
1719     pub type Second<T> = <T as Pair>::Second;
1720 }
1721