1use crate::lib::*;
25
26use self::private::{First, Second};
27use crate::de::{self, size_hint, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor};
28use crate::ser;
29
30macro_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#[derive(Clone, PartialEq)]
51pub struct Error {
52 err: ErrorImpl,
53}
54
55#[cfg(any(feature = "std", feature = "alloc"))]
56type ErrorImpl = Box<str>;
57#[cfg(not(any(feature = "std", feature = "alloc")))]
58type ErrorImpl = ();
59
60impl de::Error for Error {
61 #[cfg(any(feature = "std", feature = "alloc"))]
62 #[cold]
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]
74 fn custom<T>(msg: T) -> Self
75 where
76 T: Display,
77 {
78 let _ = msg;
79 Error { err: () }
80 }
81}
82
83impl ser::Error for Error {
84 #[cold]
85 fn custom<T>(msg: T) -> Self
86 where
87 T: Display,
88 {
89 de::Error::custom(msg)
90 }
91}
92
93impl Display for Error {
94 #[cfg(any(feature = "std", feature = "alloc"))]
95 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")))]
100 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
101 formatter.write_str("Serde deserialization error")
102 }
103}
104
105impl Debug for Error {
106 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(docsrs, doc(cfg(feature = "std")))]
116impl error::Error for Error {
117 fn description(&self) -> &str {
118 &self.err
119 }
120}
121
122impl<'de, E> IntoDeserializer<'de, E> for ()
125where
126 E: de::Error,
127{
128 type Deserializer = UnitDeserializer<E>;
129
130 fn into_deserializer(self) -> UnitDeserializer<E> {
131 UnitDeserializer::new()
132 }
133}
134
135pub struct UnitDeserializer<E> {
137 marker: PhantomData<E>,
138}
139
140impl_copy_clone!(UnitDeserializer);
141
142impl<E> UnitDeserializer<E> {
143 #[allow(missing_docs)]
144 pub fn new() -> Self {
145 UnitDeserializer {
146 marker: PhantomData,
147 }
148 }
149}
150
151impl<'de, E> de::Deserializer<'de> for UnitDeserializer<E>
152where
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
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
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
178impl<'de, E> IntoDeserializer<'de, E> for UnitDeserializer<E>
179where
180 E: de::Error,
181{
182 type Deserializer = Self;
183
184 fn into_deserializer(self) -> Self {
185 self
186 }
187}
188
189impl<E> Debug for UnitDeserializer<E> {
190 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
191 formatter.debug_struct("UnitDeserializer").finish()
192 }
193}
194
195#[cfg(feature = "unstable")]
199#[cfg_attr(docsrs, doc(cfg(feature = "unstable")))]
200pub struct NeverDeserializer<E> {
201 never: !,
202 marker: PhantomData<E>,
203}
204
205#[cfg(feature = "unstable")]
206#[cfg_attr(docsrs, doc(cfg(feature = "unstable")))]
207impl<'de, E> IntoDeserializer<'de, E> for !
208where
209 E: de::Error,
210{
211 type Deserializer = NeverDeserializer<E>;
212
213 fn into_deserializer(self) -> Self::Deserializer {
214 self
215 }
216}
217
218#[cfg(feature = "unstable")]
219impl<'de, E> de::Deserializer<'de> for NeverDeserializer<E>
220where
221 E: de::Error,
222{
223 type Error = E;
224
225 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
226 where
227 V: de::Visitor<'de>,
228 {
229 self.never
230 }
231
232 forward_to_deserialize_any! {
233 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
234 bytes byte_buf option unit unit_struct newtype_struct seq tuple
235 tuple_struct map struct enum identifier ignored_any
236 }
237}
238
239#[cfg(feature = "unstable")]
240impl<'de, E> IntoDeserializer<'de, E> for NeverDeserializer<E>
241where
242 E: de::Error,
243{
244 type Deserializer = Self;
245
246 fn into_deserializer(self) -> Self {
247 self
248 }
249}
250
251macro_rules! primitive_deserializer {
254 ($ty:ty, $doc:tt, $name:ident, $method:ident $($cast:tt)*) => {
255 #[doc = "A deserializer holding"]
256 #[doc = $doc]
257 pub struct $name<E> {
258 value: $ty,
259 marker: PhantomData<E>
260 }
261
262 impl_copy_clone!($name);
263
264 impl<'de, E> IntoDeserializer<'de, E> for $ty
265 where
266 E: de::Error,
267 {
268 type Deserializer = $name<E>;
269
270 fn into_deserializer(self) -> $name<E> {
271 $name::new(self)
272 }
273 }
274
275 impl<E> $name<E> {
276 #[allow(missing_docs)]
277 pub fn new(value: $ty) -> Self {
278 $name {
279 value,
280 marker: PhantomData,
281 }
282 }
283 }
284
285 impl<'de, E> de::Deserializer<'de> for $name<E>
286 where
287 E: de::Error,
288 {
289 type Error = E;
290
291 forward_to_deserialize_any! {
292 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str
293 string bytes byte_buf option unit unit_struct newtype_struct seq
294 tuple tuple_struct map struct enum identifier ignored_any
295 }
296
297 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
298 where
299 V: de::Visitor<'de>,
300 {
301 visitor.$method(self.value $($cast)*)
302 }
303 }
304
305 impl<'de, E> IntoDeserializer<'de, E> for $name<E>
306 where
307 E: de::Error,
308 {
309 type Deserializer = Self;
310
311 fn into_deserializer(self) -> Self {
312 self
313 }
314 }
315
316 impl<E> Debug for $name<E> {
317 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
318 formatter
319 .debug_struct(stringify!($name))
320 .field("value", &self.value)
321 .finish()
322 }
323 }
324 }
325}
326
327primitive_deserializer!(bool, "a `bool`.", BoolDeserializer, visit_bool);
328primitive_deserializer!(i8, "an `i8`.", I8Deserializer, visit_i8);
329primitive_deserializer!(i16, "an `i16`.", I16Deserializer, visit_i16);
330primitive_deserializer!(i32, "an `i32`.", I32Deserializer, visit_i32);
331primitive_deserializer!(i64, "an `i64`.", I64Deserializer, visit_i64);
332primitive_deserializer!(i128, "an `i128`.", I128Deserializer, visit_i128);
333primitive_deserializer!(isize, "an `isize`.", IsizeDeserializer, visit_i64 as i64);
334primitive_deserializer!(u8, "a `u8`.", U8Deserializer, visit_u8);
335primitive_deserializer!(u16, "a `u16`.", U16Deserializer, visit_u16);
336primitive_deserializer!(u64, "a `u64`.", U64Deserializer, visit_u64);
337primitive_deserializer!(u128, "a `u128`.", U128Deserializer, visit_u128);
338primitive_deserializer!(usize, "a `usize`.", UsizeDeserializer, visit_u64 as u64);
339primitive_deserializer!(f32, "an `f32`.", F32Deserializer, visit_f32);
340primitive_deserializer!(f64, "an `f64`.", F64Deserializer, visit_f64);
341primitive_deserializer!(char, "a `char`.", CharDeserializer, visit_char);
342
343pub struct U32Deserializer<E> {
345 value: u32,
346 marker: PhantomData<E>,
347}
348
349impl_copy_clone!(U32Deserializer);
350
351impl<'de, E> IntoDeserializer<'de, E> for u32
352where
353 E: de::Error,
354{
355 type Deserializer = U32Deserializer<E>;
356
357 fn into_deserializer(self) -> U32Deserializer<E> {
358 U32Deserializer::new(self)
359 }
360}
361
362impl<E> U32Deserializer<E> {
363 #[allow(missing_docs)]
364 pub fn new(value: u32) -> Self {
365 U32Deserializer {
366 value,
367 marker: PhantomData,
368 }
369 }
370}
371
372impl<'de, E> de::Deserializer<'de> for U32Deserializer<E>
373where
374 E: de::Error,
375{
376 type Error = E;
377
378 forward_to_deserialize_any! {
379 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
380 bytes byte_buf option unit unit_struct newtype_struct seq tuple
381 tuple_struct map struct identifier ignored_any
382 }
383
384 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
385 where
386 V: de::Visitor<'de>,
387 {
388 visitor.visit_u32(self.value)
389 }
390
391 fn deserialize_enum<V>(
392 self,
393 name: &str,
394 variants: &'static [&'static str],
395 visitor: V,
396 ) -> Result<V::Value, Self::Error>
397 where
398 V: de::Visitor<'de>,
399 {
400 let _ = name;
401 let _ = variants;
402 visitor.visit_enum(self)
403 }
404}
405
406impl<'de, E> IntoDeserializer<'de, E> for U32Deserializer<E>
407where
408 E: de::Error,
409{
410 type Deserializer = Self;
411
412 fn into_deserializer(self) -> Self {
413 self
414 }
415}
416
417impl<'de, E> de::EnumAccess<'de> for U32Deserializer<E>
418where
419 E: de::Error,
420{
421 type Error = E;
422 type Variant = private::UnitOnly<E>;
423
424 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
425 where
426 T: de::DeserializeSeed<'de>,
427 {
428 seed.deserialize(self).map(private::unit_only)
429 }
430}
431
432impl<E> Debug for U32Deserializer<E> {
433 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
434 formatter
435 .debug_struct("U32Deserializer")
436 .field("value", &self.value)
437 .finish()
438 }
439}
440
441pub struct StrDeserializer<'a, E> {
445 value: &'a str,
446 marker: PhantomData<E>,
447}
448
449impl_copy_clone!(StrDeserializer<'de>);
450
451impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a str
452where
453 E: de::Error,
454{
455 type Deserializer = StrDeserializer<'a, E>;
456
457 fn into_deserializer(self) -> StrDeserializer<'a, E> {
458 StrDeserializer::new(self)
459 }
460}
461
462impl<'a, E> StrDeserializer<'a, E> {
463 #[allow(missing_docs)]
464 pub fn new(value: &'a str) -> Self {
465 StrDeserializer {
466 value,
467 marker: PhantomData,
468 }
469 }
470}
471
472impl<'de, 'a, E> de::Deserializer<'de> for StrDeserializer<'a, E>
473where
474 E: de::Error,
475{
476 type Error = E;
477
478 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
479 where
480 V: de::Visitor<'de>,
481 {
482 visitor.visit_str(self.value)
483 }
484
485 fn deserialize_enum<V>(
486 self,
487 name: &str,
488 variants: &'static [&'static str],
489 visitor: V,
490 ) -> Result<V::Value, Self::Error>
491 where
492 V: de::Visitor<'de>,
493 {
494 let _ = name;
495 let _ = variants;
496 visitor.visit_enum(self)
497 }
498
499 forward_to_deserialize_any! {
500 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
501 bytes byte_buf option unit unit_struct newtype_struct seq tuple
502 tuple_struct map struct identifier ignored_any
503 }
504}
505
506impl<'de, 'a, E> IntoDeserializer<'de, E> for StrDeserializer<'a, E>
507where
508 E: de::Error,
509{
510 type Deserializer = Self;
511
512 fn into_deserializer(self) -> Self {
513 self
514 }
515}
516
517impl<'de, 'a, E> de::EnumAccess<'de> for StrDeserializer<'a, E>
518where
519 E: de::Error,
520{
521 type Error = E;
522 type Variant = private::UnitOnly<E>;
523
524 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
525 where
526 T: de::DeserializeSeed<'de>,
527 {
528 seed.deserialize(self).map(private::unit_only)
529 }
530}
531
532impl<'a, E> Debug for StrDeserializer<'a, E> {
533 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
534 formatter
535 .debug_struct("StrDeserializer")
536 .field("value", &self.value)
537 .finish()
538 }
539}
540
541pub struct BorrowedStrDeserializer<'de, E> {
546 value: &'de str,
547 marker: PhantomData<E>,
548}
549
550impl_copy_clone!(BorrowedStrDeserializer<'de>);
551
552impl<'de, E> BorrowedStrDeserializer<'de, E> {
553 pub fn new(value: &'de str) -> BorrowedStrDeserializer<'de, E> {
555 BorrowedStrDeserializer {
556 value,
557 marker: PhantomData,
558 }
559 }
560}
561
562impl<'de, E> de::Deserializer<'de> for BorrowedStrDeserializer<'de, E>
563where
564 E: de::Error,
565{
566 type Error = E;
567
568 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
569 where
570 V: de::Visitor<'de>,
571 {
572 visitor.visit_borrowed_str(self.value)
573 }
574
575 fn deserialize_enum<V>(
576 self,
577 name: &str,
578 variants: &'static [&'static str],
579 visitor: V,
580 ) -> Result<V::Value, Self::Error>
581 where
582 V: de::Visitor<'de>,
583 {
584 let _ = name;
585 let _ = variants;
586 visitor.visit_enum(self)
587 }
588
589 forward_to_deserialize_any! {
590 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
591 bytes byte_buf option unit unit_struct newtype_struct seq tuple
592 tuple_struct map struct identifier ignored_any
593 }
594}
595
596impl<'de, E> IntoDeserializer<'de, E> for BorrowedStrDeserializer<'de, E>
597where
598 E: de::Error,
599{
600 type Deserializer = Self;
601
602 fn into_deserializer(self) -> Self {
603 self
604 }
605}
606
607impl<'de, E> de::EnumAccess<'de> for BorrowedStrDeserializer<'de, E>
608where
609 E: de::Error,
610{
611 type Error = E;
612 type Variant = private::UnitOnly<E>;
613
614 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
615 where
616 T: de::DeserializeSeed<'de>,
617 {
618 seed.deserialize(self).map(private::unit_only)
619 }
620}
621
622impl<'de, E> Debug for BorrowedStrDeserializer<'de, E> {
623 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
624 formatter
625 .debug_struct("BorrowedStrDeserializer")
626 .field("value", &self.value)
627 .finish()
628 }
629}
630
631#[cfg(any(feature = "std", feature = "alloc"))]
635#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
636pub struct StringDeserializer<E> {
637 value: String,
638 marker: PhantomData<E>,
639}
640
641#[cfg(any(feature = "std", feature = "alloc"))]
642impl<E> Clone for StringDeserializer<E> {
643 fn clone(&self) -> Self {
644 StringDeserializer {
645 value: self.value.clone(),
646 marker: PhantomData,
647 }
648 }
649}
650
651#[cfg(any(feature = "std", feature = "alloc"))]
652#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
653impl<'de, E> IntoDeserializer<'de, E> for String
654where
655 E: de::Error,
656{
657 type Deserializer = StringDeserializer<E>;
658
659 fn into_deserializer(self) -> StringDeserializer<E> {
660 StringDeserializer::new(self)
661 }
662}
663
664#[cfg(any(feature = "std", feature = "alloc"))]
665impl<E> StringDeserializer<E> {
666 #[allow(missing_docs)]
667 pub fn new(value: String) -> Self {
668 StringDeserializer {
669 value,
670 marker: PhantomData,
671 }
672 }
673}
674
675#[cfg(any(feature = "std", feature = "alloc"))]
676impl<'de, E> de::Deserializer<'de> for StringDeserializer<E>
677where
678 E: de::Error,
679{
680 type Error = E;
681
682 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
683 where
684 V: de::Visitor<'de>,
685 {
686 visitor.visit_string(self.value)
687 }
688
689 fn deserialize_enum<V>(
690 self,
691 name: &str,
692 variants: &'static [&'static str],
693 visitor: V,
694 ) -> Result<V::Value, Self::Error>
695 where
696 V: de::Visitor<'de>,
697 {
698 let _ = name;
699 let _ = variants;
700 visitor.visit_enum(self)
701 }
702
703 forward_to_deserialize_any! {
704 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
705 bytes byte_buf option unit unit_struct newtype_struct seq tuple
706 tuple_struct map struct identifier ignored_any
707 }
708}
709
710#[cfg(any(feature = "std", feature = "alloc"))]
711impl<'de, E> IntoDeserializer<'de, E> for StringDeserializer<E>
712where
713 E: de::Error,
714{
715 type Deserializer = Self;
716
717 fn into_deserializer(self) -> Self {
718 self
719 }
720}
721
722#[cfg(any(feature = "std", feature = "alloc"))]
723impl<'de, E> de::EnumAccess<'de> for StringDeserializer<E>
724where
725 E: de::Error,
726{
727 type Error = E;
728 type Variant = private::UnitOnly<E>;
729
730 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
731 where
732 T: de::DeserializeSeed<'de>,
733 {
734 seed.deserialize(self).map(private::unit_only)
735 }
736}
737
738#[cfg(any(feature = "std", feature = "alloc"))]
739impl<E> Debug for StringDeserializer<E> {
740 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
741 formatter
742 .debug_struct("StringDeserializer")
743 .field("value", &self.value)
744 .finish()
745 }
746}
747
748#[cfg(any(feature = "std", feature = "alloc"))]
752#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
753pub struct CowStrDeserializer<'a, E> {
754 value: Cow<'a, str>,
755 marker: PhantomData<E>,
756}
757
758#[cfg(any(feature = "std", feature = "alloc"))]
759impl<'a, E> Clone for CowStrDeserializer<'a, E> {
760 fn clone(&self) -> Self {
761 CowStrDeserializer {
762 value: self.value.clone(),
763 marker: PhantomData,
764 }
765 }
766}
767
768#[cfg(any(feature = "std", feature = "alloc"))]
769#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
770impl<'de, 'a, E> IntoDeserializer<'de, E> for Cow<'a, str>
771where
772 E: de::Error,
773{
774 type Deserializer = CowStrDeserializer<'a, E>;
775
776 fn into_deserializer(self) -> CowStrDeserializer<'a, E> {
777 CowStrDeserializer::new(self)
778 }
779}
780
781#[cfg(any(feature = "std", feature = "alloc"))]
782impl<'a, E> CowStrDeserializer<'a, E> {
783 #[allow(missing_docs)]
784 pub fn new(value: Cow<'a, str>) -> Self {
785 CowStrDeserializer {
786 value,
787 marker: PhantomData,
788 }
789 }
790}
791
792#[cfg(any(feature = "std", feature = "alloc"))]
793impl<'de, 'a, E> de::Deserializer<'de> for CowStrDeserializer<'a, E>
794where
795 E: de::Error,
796{
797 type Error = E;
798
799 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
800 where
801 V: de::Visitor<'de>,
802 {
803 match self.value {
804 Cow::Borrowed(string) => visitor.visit_str(string),
805 Cow::Owned(string) => visitor.visit_string(string),
806 }
807 }
808
809 fn deserialize_enum<V>(
810 self,
811 name: &str,
812 variants: &'static [&'static str],
813 visitor: V,
814 ) -> Result<V::Value, Self::Error>
815 where
816 V: de::Visitor<'de>,
817 {
818 let _ = name;
819 let _ = variants;
820 visitor.visit_enum(self)
821 }
822
823 forward_to_deserialize_any! {
824 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
825 bytes byte_buf option unit unit_struct newtype_struct seq tuple
826 tuple_struct map struct identifier ignored_any
827 }
828}
829
830#[cfg(any(feature = "std", feature = "alloc"))]
831impl<'de, 'a, E> IntoDeserializer<'de, E> for CowStrDeserializer<'a, E>
832where
833 E: de::Error,
834{
835 type Deserializer = Self;
836
837 fn into_deserializer(self) -> Self {
838 self
839 }
840}
841
842#[cfg(any(feature = "std", feature = "alloc"))]
843impl<'de, 'a, E> de::EnumAccess<'de> for CowStrDeserializer<'a, E>
844where
845 E: de::Error,
846{
847 type Error = E;
848 type Variant = private::UnitOnly<E>;
849
850 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
851 where
852 T: de::DeserializeSeed<'de>,
853 {
854 seed.deserialize(self).map(private::unit_only)
855 }
856}
857
858#[cfg(any(feature = "std", feature = "alloc"))]
859impl<'a, E> Debug for CowStrDeserializer<'a, E> {
860 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
861 formatter
862 .debug_struct("CowStrDeserializer")
863 .field("value", &self.value)
864 .finish()
865 }
866}
867
868pub struct BytesDeserializer<'a, E> {
872 value: &'a [u8],
873 marker: PhantomData<E>,
874}
875
876impl<'a, E> BytesDeserializer<'a, E> {
877 pub fn new(value: &'a [u8]) -> Self {
879 BytesDeserializer {
880 value,
881 marker: PhantomData,
882 }
883 }
884}
885
886impl_copy_clone!(BytesDeserializer<'a>);
887
888impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a [u8]
889where
890 E: de::Error,
891{
892 type Deserializer = BytesDeserializer<'a, E>;
893
894 fn into_deserializer(self) -> BytesDeserializer<'a, E> {
895 BytesDeserializer::new(self)
896 }
897}
898
899impl<'de, 'a, E> Deserializer<'de> for BytesDeserializer<'a, E>
900where
901 E: de::Error,
902{
903 type Error = E;
904
905 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
906 where
907 V: Visitor<'de>,
908 {
909 visitor.visit_bytes(self.value)
910 }
911
912 forward_to_deserialize_any! {
913 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
914 bytes byte_buf option unit unit_struct newtype_struct seq tuple
915 tuple_struct map struct enum identifier ignored_any
916 }
917}
918
919impl<'de, 'a, E> IntoDeserializer<'de, E> for BytesDeserializer<'a, E>
920where
921 E: de::Error,
922{
923 type Deserializer = Self;
924
925 fn into_deserializer(self) -> Self {
926 self
927 }
928}
929
930impl<'a, E> Debug for BytesDeserializer<'a, E> {
931 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
932 formatter
933 .debug_struct("BytesDeserializer")
934 .field("value", &self.value)
935 .finish()
936 }
937}
938
939pub struct BorrowedBytesDeserializer<'de, E> {
942 value: &'de [u8],
943 marker: PhantomData<E>,
944}
945
946impl<'de, E> BorrowedBytesDeserializer<'de, E> {
947 pub fn new(value: &'de [u8]) -> Self {
949 BorrowedBytesDeserializer {
950 value,
951 marker: PhantomData,
952 }
953 }
954}
955
956impl_copy_clone!(BorrowedBytesDeserializer<'de>);
957
958impl<'de, E> Deserializer<'de> for BorrowedBytesDeserializer<'de, E>
959where
960 E: de::Error,
961{
962 type Error = E;
963
964 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
965 where
966 V: Visitor<'de>,
967 {
968 visitor.visit_borrowed_bytes(self.value)
969 }
970
971 forward_to_deserialize_any! {
972 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
973 bytes byte_buf option unit unit_struct newtype_struct seq tuple
974 tuple_struct map struct enum identifier ignored_any
975 }
976}
977
978impl<'de, E> IntoDeserializer<'de, E> for BorrowedBytesDeserializer<'de, E>
979where
980 E: de::Error,
981{
982 type Deserializer = Self;
983
984 fn into_deserializer(self) -> Self {
985 self
986 }
987}
988
989impl<'de, E> Debug for BorrowedBytesDeserializer<'de, E> {
990 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
991 formatter
992 .debug_struct("BorrowedBytesDeserializer")
993 .field("value", &self.value)
994 .finish()
995 }
996}
997
998#[derive(Clone)]
1002pub struct SeqDeserializer<I, E> {
1003 iter: iter::Fuse<I>,
1004 count: usize,
1005 marker: PhantomData<E>,
1006}
1007
1008impl<I, E> SeqDeserializer<I, E>
1009where
1010 I: Iterator,
1011{
1012 pub fn new(iter: I) -> Self {
1014 SeqDeserializer {
1015 iter: iter.fuse(),
1016 count: 0,
1017 marker: PhantomData,
1018 }
1019 }
1020}
1021
1022impl<I, E> SeqDeserializer<I, E>
1023where
1024 I: Iterator,
1025 E: de::Error,
1026{
1027 pub fn end(self) -> Result<(), E> {
1030 let remaining = self.iter.count();
1031 if remaining == 0 {
1032 Ok(())
1033 } else {
1034 Err(de::Error::invalid_length(
1037 self.count + remaining,
1038 &ExpectedInSeq(self.count),
1039 ))
1040 }
1041 }
1042}
1043
1044impl<'de, I, T, E> de::Deserializer<'de> for SeqDeserializer<I, E>
1045where
1046 I: Iterator<Item = T>,
1047 T: IntoDeserializer<'de, E>,
1048 E: de::Error,
1049{
1050 type Error = E;
1051
1052 fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1053 where
1054 V: de::Visitor<'de>,
1055 {
1056 let v = tri!(visitor.visit_seq(&mut self));
1057 tri!(self.end());
1058 Ok(v)
1059 }
1060
1061 forward_to_deserialize_any! {
1062 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1063 bytes byte_buf option unit unit_struct newtype_struct seq tuple
1064 tuple_struct map struct enum identifier ignored_any
1065 }
1066}
1067
1068impl<'de, I, T, E> IntoDeserializer<'de, E> for SeqDeserializer<I, E>
1069where
1070 I: Iterator<Item = T>,
1071 T: IntoDeserializer<'de, E>,
1072 E: de::Error,
1073{
1074 type Deserializer = Self;
1075
1076 fn into_deserializer(self) -> Self {
1077 self
1078 }
1079}
1080
1081impl<'de, I, T, E> de::SeqAccess<'de> for SeqDeserializer<I, E>
1082where
1083 I: Iterator<Item = T>,
1084 T: IntoDeserializer<'de, E>,
1085 E: de::Error,
1086{
1087 type Error = E;
1088
1089 fn next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error>
1090 where
1091 V: de::DeserializeSeed<'de>,
1092 {
1093 match self.iter.next() {
1094 Some(value) => {
1095 self.count += 1;
1096 seed.deserialize(value.into_deserializer()).map(Some)
1097 }
1098 None => Ok(None),
1099 }
1100 }
1101
1102 fn size_hint(&self) -> Option<usize> {
1103 size_hint::from_bounds(&self.iter)
1104 }
1105}
1106
1107struct ExpectedInSeq(usize);
1108
1109impl Expected for ExpectedInSeq {
1110 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1111 if self.0 == 1 {
1112 formatter.write_str("1 element in sequence")
1113 } else {
1114 write!(formatter, "{} elements in sequence", self.0)
1115 }
1116 }
1117}
1118
1119impl<I, E> Debug for SeqDeserializer<I, E>
1120where
1121 I: Debug,
1122{
1123 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1124 formatter
1125 .debug_struct("SeqDeserializer")
1126 .field("iter", &self.iter)
1127 .field("count", &self.count)
1128 .finish()
1129 }
1130}
1131
1132#[cfg(any(feature = "std", feature = "alloc"))]
1135#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
1136impl<'de, T, E> IntoDeserializer<'de, E> for Vec<T>
1137where
1138 T: IntoDeserializer<'de, E>,
1139 E: de::Error,
1140{
1141 type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;
1142
1143 fn into_deserializer(self) -> Self::Deserializer {
1144 SeqDeserializer::new(self.into_iter())
1145 }
1146}
1147
1148#[cfg(any(feature = "std", feature = "alloc"))]
1149#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
1150impl<'de, T, E> IntoDeserializer<'de, E> for BTreeSet<T>
1151where
1152 T: IntoDeserializer<'de, E> + Eq + Ord,
1153 E: de::Error,
1154{
1155 type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;
1156
1157 fn into_deserializer(self) -> Self::Deserializer {
1158 SeqDeserializer::new(self.into_iter())
1159 }
1160}
1161
1162#[cfg(feature = "std")]
1163#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
1164impl<'de, T, S, E> IntoDeserializer<'de, E> for HashSet<T, S>
1165where
1166 T: IntoDeserializer<'de, E> + Eq + Hash,
1167 S: BuildHasher,
1168 E: de::Error,
1169{
1170 type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;
1171
1172 fn into_deserializer(self) -> Self::Deserializer {
1173 SeqDeserializer::new(self.into_iter())
1174 }
1175}
1176
1177#[derive(Clone, Debug)]
1181pub struct SeqAccessDeserializer<A> {
1182 seq: A,
1183}
1184
1185impl<A> SeqAccessDeserializer<A> {
1186 pub fn new(seq: A) -> Self {
1188 SeqAccessDeserializer { seq }
1189 }
1190}
1191
1192impl<'de, A> de::Deserializer<'de> for SeqAccessDeserializer<A>
1193where
1194 A: de::SeqAccess<'de>,
1195{
1196 type Error = A::Error;
1197
1198 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1199 where
1200 V: de::Visitor<'de>,
1201 {
1202 visitor.visit_seq(self.seq)
1203 }
1204
1205 forward_to_deserialize_any! {
1206 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1207 bytes byte_buf option unit unit_struct newtype_struct seq tuple
1208 tuple_struct map struct enum identifier ignored_any
1209 }
1210}
1211
1212impl<'de, A> IntoDeserializer<'de, A::Error> for SeqAccessDeserializer<A>
1213where
1214 A: de::SeqAccess<'de>,
1215{
1216 type Deserializer = Self;
1217
1218 fn into_deserializer(self) -> Self {
1219 self
1220 }
1221}
1222
1223pub struct MapDeserializer<'de, I, E>
1227where
1228 I: Iterator,
1229 I::Item: private::Pair,
1230{
1231 iter: iter::Fuse<I>,
1232 value: Option<Second<I::Item>>,
1233 count: usize,
1234 lifetime: PhantomData<&'de ()>,
1235 error: PhantomData<E>,
1236}
1237
1238impl<'de, I, E> MapDeserializer<'de, I, E>
1239where
1240 I: Iterator,
1241 I::Item: private::Pair,
1242{
1243 pub fn new(iter: I) -> Self {
1245 MapDeserializer {
1246 iter: iter.fuse(),
1247 value: None,
1248 count: 0,
1249 lifetime: PhantomData,
1250 error: PhantomData,
1251 }
1252 }
1253}
1254
1255impl<'de, I, E> MapDeserializer<'de, I, E>
1256where
1257 I: Iterator,
1258 I::Item: private::Pair,
1259 E: de::Error,
1260{
1261 pub fn end(self) -> Result<(), E> {
1264 let remaining = self.iter.count();
1265 if remaining == 0 {
1266 Ok(())
1267 } else {
1268 Err(de::Error::invalid_length(
1271 self.count + remaining,
1272 &ExpectedInMap(self.count),
1273 ))
1274 }
1275 }
1276}
1277
1278impl<'de, I, E> MapDeserializer<'de, I, E>
1279where
1280 I: Iterator,
1281 I::Item: private::Pair,
1282{
1283 fn next_pair(&mut self) -> Option<(First<I::Item>, Second<I::Item>)> {
1284 match self.iter.next() {
1285 Some(kv) => {
1286 self.count += 1;
1287 Some(private::Pair::split(kv))
1288 }
1289 None => None,
1290 }
1291 }
1292}
1293
1294impl<'de, I, E> de::Deserializer<'de> for MapDeserializer<'de, I, E>
1295where
1296 I: Iterator,
1297 I::Item: private::Pair,
1298 First<I::Item>: IntoDeserializer<'de, E>,
1299 Second<I::Item>: IntoDeserializer<'de, E>,
1300 E: de::Error,
1301{
1302 type Error = E;
1303
1304 fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1305 where
1306 V: de::Visitor<'de>,
1307 {
1308 let value = tri!(visitor.visit_map(&mut self));
1309 tri!(self.end());
1310 Ok(value)
1311 }
1312
1313 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1314 where
1315 V: de::Visitor<'de>,
1316 {
1317 let value = tri!(visitor.visit_seq(&mut self));
1318 tri!(self.end());
1319 Ok(value)
1320 }
1321
1322 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1323 where
1324 V: de::Visitor<'de>,
1325 {
1326 let _ = len;
1327 self.deserialize_seq(visitor)
1328 }
1329
1330 forward_to_deserialize_any! {
1331 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1332 bytes byte_buf option unit unit_struct newtype_struct tuple_struct map
1333 struct enum identifier ignored_any
1334 }
1335}
1336
1337impl<'de, I, E> IntoDeserializer<'de, E> for MapDeserializer<'de, I, E>
1338where
1339 I: Iterator,
1340 I::Item: private::Pair,
1341 First<I::Item>: IntoDeserializer<'de, E>,
1342 Second<I::Item>: IntoDeserializer<'de, E>,
1343 E: de::Error,
1344{
1345 type Deserializer = Self;
1346
1347 fn into_deserializer(self) -> Self {
1348 self
1349 }
1350}
1351
1352impl<'de, I, E> de::MapAccess<'de> for MapDeserializer<'de, I, E>
1353where
1354 I: Iterator,
1355 I::Item: private::Pair,
1356 First<I::Item>: IntoDeserializer<'de, E>,
1357 Second<I::Item>: IntoDeserializer<'de, E>,
1358 E: de::Error,
1359{
1360 type Error = E;
1361
1362 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1363 where
1364 T: de::DeserializeSeed<'de>,
1365 {
1366 match self.next_pair() {
1367 Some((key, value)) => {
1368 self.value = Some(value);
1369 seed.deserialize(key.into_deserializer()).map(Some)
1370 }
1371 None => Ok(None),
1372 }
1373 }
1374
1375 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
1376 where
1377 T: de::DeserializeSeed<'de>,
1378 {
1379 let value = self.value.take();
1380 let value = value.expect("MapAccess::next_value called before next_key");
1383 seed.deserialize(value.into_deserializer())
1384 }
1385
1386 fn next_entry_seed<TK, TV>(
1387 &mut self,
1388 kseed: TK,
1389 vseed: TV,
1390 ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error>
1391 where
1392 TK: de::DeserializeSeed<'de>,
1393 TV: de::DeserializeSeed<'de>,
1394 {
1395 match self.next_pair() {
1396 Some((key, value)) => {
1397 let key = tri!(kseed.deserialize(key.into_deserializer()));
1398 let value = tri!(vseed.deserialize(value.into_deserializer()));
1399 Ok(Some((key, value)))
1400 }
1401 None => Ok(None),
1402 }
1403 }
1404
1405 fn size_hint(&self) -> Option<usize> {
1406 size_hint::from_bounds(&self.iter)
1407 }
1408}
1409
1410impl<'de, I, E> de::SeqAccess<'de> for MapDeserializer<'de, I, E>
1411where
1412 I: Iterator,
1413 I::Item: private::Pair,
1414 First<I::Item>: IntoDeserializer<'de, E>,
1415 Second<I::Item>: IntoDeserializer<'de, E>,
1416 E: de::Error,
1417{
1418 type Error = E;
1419
1420 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1421 where
1422 T: de::DeserializeSeed<'de>,
1423 {
1424 match self.next_pair() {
1425 Some((k, v)) => {
1426 let de = PairDeserializer(k, v, PhantomData);
1427 seed.deserialize(de).map(Some)
1428 }
1429 None => Ok(None),
1430 }
1431 }
1432
1433 fn size_hint(&self) -> Option<usize> {
1434 size_hint::from_bounds(&self.iter)
1435 }
1436}
1437
1438impl<'de, I, E> Clone for MapDeserializer<'de, I, E>
1440where
1441 I: Iterator + Clone,
1442 I::Item: private::Pair,
1443 Second<I::Item>: Clone,
1444{
1445 fn clone(&self) -> Self {
1446 MapDeserializer {
1447 iter: self.iter.clone(),
1448 value: self.value.clone(),
1449 count: self.count,
1450 lifetime: self.lifetime,
1451 error: self.error,
1452 }
1453 }
1454}
1455
1456impl<'de, I, E> Debug for MapDeserializer<'de, I, E>
1457where
1458 I: Iterator + Debug,
1459 I::Item: private::Pair,
1460 Second<I::Item>: Debug,
1461{
1462 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1463 formatter
1464 .debug_struct("MapDeserializer")
1465 .field("iter", &self.iter)
1466 .field("value", &self.value)
1467 .field("count", &self.count)
1468 .finish()
1469 }
1470}
1471
1472struct PairDeserializer<A, B, E>(A, B, PhantomData<E>);
1475
1476impl<'de, A, B, E> de::Deserializer<'de> for PairDeserializer<A, B, E>
1477where
1478 A: IntoDeserializer<'de, E>,
1479 B: IntoDeserializer<'de, E>,
1480 E: de::Error,
1481{
1482 type Error = E;
1483
1484 forward_to_deserialize_any! {
1485 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1486 bytes byte_buf option unit unit_struct newtype_struct tuple_struct map
1487 struct enum identifier ignored_any
1488 }
1489
1490 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1491 where
1492 V: de::Visitor<'de>,
1493 {
1494 self.deserialize_seq(visitor)
1495 }
1496
1497 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1498 where
1499 V: de::Visitor<'de>,
1500 {
1501 let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData);
1502 let pair = tri!(visitor.visit_seq(&mut pair_visitor));
1503 if pair_visitor.1.is_none() {
1504 Ok(pair)
1505 } else {
1506 let remaining = pair_visitor.size_hint().unwrap();
1507 Err(de::Error::invalid_length(2, &ExpectedInSeq(2 - remaining)))
1510 }
1511 }
1512
1513 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1514 where
1515 V: de::Visitor<'de>,
1516 {
1517 if len == 2 {
1518 self.deserialize_seq(visitor)
1519 } else {
1520 Err(de::Error::invalid_length(2, &ExpectedInSeq(len)))
1523 }
1524 }
1525}
1526
1527struct PairVisitor<A, B, E>(Option<A>, Option<B>, PhantomData<E>);
1528
1529impl<'de, A, B, E> de::SeqAccess<'de> for PairVisitor<A, B, E>
1530where
1531 A: IntoDeserializer<'de, E>,
1532 B: IntoDeserializer<'de, E>,
1533 E: de::Error,
1534{
1535 type Error = E;
1536
1537 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1538 where
1539 T: de::DeserializeSeed<'de>,
1540 {
1541 if let Some(k) = self.0.take() {
1542 seed.deserialize(k.into_deserializer()).map(Some)
1543 } else if let Some(v) = self.1.take() {
1544 seed.deserialize(v.into_deserializer()).map(Some)
1545 } else {
1546 Ok(None)
1547 }
1548 }
1549
1550 fn size_hint(&self) -> Option<usize> {
1551 if self.0.is_some() {
1552 Some(2)
1553 } else if self.1.is_some() {
1554 Some(1)
1555 } else {
1556 Some(0)
1557 }
1558 }
1559}
1560
1561struct ExpectedInMap(usize);
1562
1563impl Expected for ExpectedInMap {
1564 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1565 if self.0 == 1 {
1566 formatter.write_str("1 element in map")
1567 } else {
1568 write!(formatter, "{} elements in map", self.0)
1569 }
1570 }
1571}
1572
1573#[cfg(any(feature = "std", feature = "alloc"))]
1576#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
1577impl<'de, K, V, E> IntoDeserializer<'de, E> for BTreeMap<K, V>
1578where
1579 K: IntoDeserializer<'de, E> + Eq + Ord,
1580 V: IntoDeserializer<'de, E>,
1581 E: de::Error,
1582{
1583 type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>;
1584
1585 fn into_deserializer(self) -> Self::Deserializer {
1586 MapDeserializer::new(self.into_iter())
1587 }
1588}
1589
1590#[cfg(feature = "std")]
1591#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
1592impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S>
1593where
1594 K: IntoDeserializer<'de, E> + Eq + Hash,
1595 V: IntoDeserializer<'de, E>,
1596 S: BuildHasher,
1597 E: de::Error,
1598{
1599 type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>;
1600
1601 fn into_deserializer(self) -> Self::Deserializer {
1602 MapDeserializer::new(self.into_iter())
1603 }
1604}
1605
1606#[derive(Clone, Debug)]
1610pub struct MapAccessDeserializer<A> {
1611 map: A,
1612}
1613
1614impl<A> MapAccessDeserializer<A> {
1615 pub fn new(map: A) -> Self {
1617 MapAccessDeserializer { map }
1618 }
1619}
1620
1621impl<'de, A> de::Deserializer<'de> for MapAccessDeserializer<A>
1622where
1623 A: de::MapAccess<'de>,
1624{
1625 type Error = A::Error;
1626
1627 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1628 where
1629 V: de::Visitor<'de>,
1630 {
1631 visitor.visit_map(self.map)
1632 }
1633
1634 fn deserialize_enum<V>(
1635 self,
1636 _name: &str,
1637 _variants: &'static [&'static str],
1638 visitor: V,
1639 ) -> Result<V::Value, Self::Error>
1640 where
1641 V: de::Visitor<'de>,
1642 {
1643 visitor.visit_enum(self)
1644 }
1645
1646 forward_to_deserialize_any! {
1647 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1648 bytes byte_buf option unit unit_struct newtype_struct seq tuple
1649 tuple_struct map struct identifier ignored_any
1650 }
1651}
1652
1653impl<'de, A> IntoDeserializer<'de, A::Error> for MapAccessDeserializer<A>
1654where
1655 A: de::MapAccess<'de>,
1656{
1657 type Deserializer = Self;
1658
1659 fn into_deserializer(self) -> Self {
1660 self
1661 }
1662}
1663
1664impl<'de, A> de::EnumAccess<'de> for MapAccessDeserializer<A>
1665where
1666 A: de::MapAccess<'de>,
1667{
1668 type Error = A::Error;
1669 type Variant = private::MapAsEnum<A>;
1670
1671 fn variant_seed<T>(mut self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
1672 where
1673 T: de::DeserializeSeed<'de>,
1674 {
1675 match tri!(self.map.next_key_seed(seed)) {
1676 Some(key) => Ok((key, private::map_as_enum(self.map))),
1677 None => Err(de::Error::invalid_type(de::Unexpected::Map, &"enum")),
1678 }
1679 }
1680}
1681
1682#[derive(Clone, Debug)]
1686pub struct EnumAccessDeserializer<A> {
1687 access: A,
1688}
1689
1690impl<A> EnumAccessDeserializer<A> {
1691 pub fn new(access: A) -> Self {
1693 EnumAccessDeserializer { access }
1694 }
1695}
1696
1697impl<'de, A> de::Deserializer<'de> for EnumAccessDeserializer<A>
1698where
1699 A: de::EnumAccess<'de>,
1700{
1701 type Error = A::Error;
1702
1703 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1704 where
1705 V: de::Visitor<'de>,
1706 {
1707 visitor.visit_enum(self.access)
1708 }
1709
1710 forward_to_deserialize_any! {
1711 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1712 bytes byte_buf option unit unit_struct newtype_struct seq tuple
1713 tuple_struct map struct enum identifier ignored_any
1714 }
1715}
1716
1717impl<'de, A> IntoDeserializer<'de, A::Error> for EnumAccessDeserializer<A>
1718where
1719 A: de::EnumAccess<'de>,
1720{
1721 type Deserializer = Self;
1722
1723 fn into_deserializer(self) -> Self {
1724 self
1725 }
1726}
1727
1728mod private {
1731 use crate::lib::*;
1732
1733 use crate::de::{
1734 self, DeserializeSeed, Deserializer, MapAccess, Unexpected, VariantAccess, Visitor,
1735 };
1736
1737 pub struct UnitOnly<E> {
1738 marker: PhantomData<E>,
1739 }
1740
1741 pub fn unit_only<T, E>(t: T) -> (T, UnitOnly<E>) {
1742 (
1743 t,
1744 UnitOnly {
1745 marker: PhantomData,
1746 },
1747 )
1748 }
1749
1750 impl<'de, E> de::VariantAccess<'de> for UnitOnly<E>
1751 where
1752 E: de::Error,
1753 {
1754 type Error = E;
1755
1756 fn unit_variant(self) -> Result<(), Self::Error> {
1757 Ok(())
1758 }
1759
1760 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>
1761 where
1762 T: de::DeserializeSeed<'de>,
1763 {
1764 Err(de::Error::invalid_type(
1765 Unexpected::UnitVariant,
1766 &"newtype variant",
1767 ))
1768 }
1769
1770 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>
1771 where
1772 V: de::Visitor<'de>,
1773 {
1774 Err(de::Error::invalid_type(
1775 Unexpected::UnitVariant,
1776 &"tuple variant",
1777 ))
1778 }
1779
1780 fn struct_variant<V>(
1781 self,
1782 _fields: &'static [&'static str],
1783 _visitor: V,
1784 ) -> Result<V::Value, Self::Error>
1785 where
1786 V: de::Visitor<'de>,
1787 {
1788 Err(de::Error::invalid_type(
1789 Unexpected::UnitVariant,
1790 &"struct variant",
1791 ))
1792 }
1793 }
1794
1795 pub struct MapAsEnum<A> {
1796 map: A,
1797 }
1798
1799 pub fn map_as_enum<A>(map: A) -> MapAsEnum<A> {
1800 MapAsEnum { map }
1801 }
1802
1803 impl<'de, A> VariantAccess<'de> for MapAsEnum<A>
1804 where
1805 A: MapAccess<'de>,
1806 {
1807 type Error = A::Error;
1808
1809 fn unit_variant(mut self) -> Result<(), Self::Error> {
1810 self.map.next_value()
1811 }
1812
1813 fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error>
1814 where
1815 T: DeserializeSeed<'de>,
1816 {
1817 self.map.next_value_seed(seed)
1818 }
1819
1820 fn tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1821 where
1822 V: Visitor<'de>,
1823 {
1824 self.map.next_value_seed(SeedTupleVariant { len, visitor })
1825 }
1826
1827 fn struct_variant<V>(
1828 mut self,
1829 _fields: &'static [&'static str],
1830 visitor: V,
1831 ) -> Result<V::Value, Self::Error>
1832 where
1833 V: Visitor<'de>,
1834 {
1835 self.map.next_value_seed(SeedStructVariant { visitor })
1836 }
1837 }
1838
1839 struct SeedTupleVariant<V> {
1840 len: usize,
1841 visitor: V,
1842 }
1843
1844 impl<'de, V> DeserializeSeed<'de> for SeedTupleVariant<V>
1845 where
1846 V: Visitor<'de>,
1847 {
1848 type Value = V::Value;
1849
1850 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1851 where
1852 D: Deserializer<'de>,
1853 {
1854 deserializer.deserialize_tuple(self.len, self.visitor)
1855 }
1856 }
1857
1858 struct SeedStructVariant<V> {
1859 visitor: V,
1860 }
1861
1862 impl<'de, V> DeserializeSeed<'de> for SeedStructVariant<V>
1863 where
1864 V: Visitor<'de>,
1865 {
1866 type Value = V::Value;
1867
1868 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1869 where
1870 D: Deserializer<'de>,
1871 {
1872 deserializer.deserialize_map(self.visitor)
1873 }
1874 }
1875
1876 pub trait Pair {
1879 type First;
1880 type Second;
1881 fn split(self) -> (Self::First, Self::Second);
1882 }
1883
1884 impl<A, B> Pair for (A, B) {
1885 type First = A;
1886 type Second = B;
1887 fn split(self) -> (A, B) {
1888 self
1889 }
1890 }
1891
1892 pub type First<T> = <T as Pair>::First;
1893 pub type Second<T> = <T as Pair>::Second;
1894}