3 use de
::value
::{BorrowedBytesDeserializer, BytesDeserializer}
;
4 use de
::{Deserialize, Deserializer, Error, IntoDeserializer, Visitor}
;
6 #[cfg(any(feature = "std", feature = "alloc"))]
7 use de
::{DeserializeSeed, MapAccess, Unexpected}
;
9 #[cfg(any(feature = "std", feature = "alloc"))]
10 pub use self::content
::{
11 Content
, ContentDeserializer
, ContentRefDeserializer
, EnumDeserializer
,
12 InternallyTaggedUnitVisitor
, TagContentOtherField
, TagContentOtherFieldVisitor
,
13 TagOrContentField
, TagOrContentFieldVisitor
, TaggedContentVisitor
, UntaggedUnitVisitor
,
16 pub use seed
::InPlaceSeed
;
18 /// If the missing field is of type `Option<T>` then treat is as `None`,
19 /// otherwise it is an error.
20 pub fn missing_field
<'de
, V
, E
>(field
: &'
static str) -> Result
<V
, E
>
25 struct MissingFieldDeserializer
<E
>(&'
static str, PhantomData
<E
>);
27 impl<'de
, E
> Deserializer
<'de
> for MissingFieldDeserializer
<E
>
33 fn deserialize_any
<V
>(self, _visitor
: V
) -> Result
<V
::Value
, E
>
37 Err(Error
::missing_field(self.0))
40 fn deserialize_option
<V
>(self, visitor
: V
) -> Result
<V
::Value
, E
>
47 forward_to_deserialize_any
! {
48 bool
i8 i16 i32 i64 i128
u8 u16 u32 u64 u128
f32 f64 char str string
49 bytes byte_buf unit unit_struct newtype_struct seq tuple
50 tuple_struct map
struct enum identifier ignored_any
54 let deserializer
= MissingFieldDeserializer(field
, PhantomData
);
55 Deserialize
::deserialize(deserializer
)
58 #[cfg(any(feature = "std", feature = "alloc"))]
59 pub fn borrow_cow_str
<'de
: 'a
, 'a
, D
, R
>(deserializer
: D
) -> Result
<R
, D
::Error
>
62 R
: From
<Cow
<'a
, str>>,
66 impl<'a
> Visitor
<'a
> for CowStrVisitor
{
67 type Value
= Cow
<'a
, str>;
69 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
70 formatter
.write_str("a string")
73 fn visit_str
<E
>(self, v
: &str) -> Result
<Self::Value
, E
>
77 Ok(Cow
::Owned(v
.to_owned()))
80 fn visit_borrowed_str
<E
>(self, v
: &'a
str) -> Result
<Self::Value
, E
>
87 fn visit_string
<E
>(self, v
: String
) -> Result
<Self::Value
, E
>
94 fn visit_bytes
<E
>(self, v
: &[u8]) -> Result
<Self::Value
, E
>
98 match str::from_utf8(v
) {
99 Ok(s
) => Ok(Cow
::Owned(s
.to_owned())),
100 Err(_
) => Err(Error
::invalid_value(Unexpected
::Bytes(v
), &self)),
104 fn visit_borrowed_bytes
<E
>(self, v
: &'a
[u8]) -> Result
<Self::Value
, E
>
108 match str::from_utf8(v
) {
109 Ok(s
) => Ok(Cow
::Borrowed(s
)),
110 Err(_
) => Err(Error
::invalid_value(Unexpected
::Bytes(v
), &self)),
114 fn visit_byte_buf
<E
>(self, v
: Vec
<u8>) -> Result
<Self::Value
, E
>
118 match String
::from_utf8(v
) {
119 Ok(s
) => Ok(Cow
::Owned(s
)),
120 Err(e
) => Err(Error
::invalid_value(
121 Unexpected
::Bytes(&e
.into_bytes()),
128 deserializer
.deserialize_str(CowStrVisitor
).map(From
::from
)
131 #[cfg(any(feature = "std", feature = "alloc"))]
132 pub fn borrow_cow_bytes
<'de
: 'a
, 'a
, D
, R
>(deserializer
: D
) -> Result
<R
, D
::Error
>
134 D
: Deserializer
<'de
>,
135 R
: From
<Cow
<'a
, [u8]>>,
137 struct CowBytesVisitor
;
139 impl<'a
> Visitor
<'a
> for CowBytesVisitor
{
140 type Value
= Cow
<'a
, [u8]>;
142 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
143 formatter
.write_str("a byte array")
146 fn visit_str
<E
>(self, v
: &str) -> Result
<Self::Value
, E
>
150 Ok(Cow
::Owned(v
.as_bytes().to_vec()))
153 fn visit_borrowed_str
<E
>(self, v
: &'a
str) -> Result
<Self::Value
, E
>
157 Ok(Cow
::Borrowed(v
.as_bytes()))
160 fn visit_string
<E
>(self, v
: String
) -> Result
<Self::Value
, E
>
164 Ok(Cow
::Owned(v
.into_bytes()))
167 fn visit_bytes
<E
>(self, v
: &[u8]) -> Result
<Self::Value
, E
>
171 Ok(Cow
::Owned(v
.to_vec()))
174 fn visit_borrowed_bytes
<E
>(self, v
: &'a
[u8]) -> Result
<Self::Value
, E
>
181 fn visit_byte_buf
<E
>(self, v
: Vec
<u8>) -> Result
<Self::Value
, E
>
190 .deserialize_bytes(CowBytesVisitor
)
194 #[cfg(any(feature = "std", feature = "alloc"))]
196 // This module is private and nothing here should be used outside of
199 // We will iterate on the implementation for a few releases and only have to
200 // worry about backward compatibility for the `untagged` and `tag` attributes
201 // rather than for this entire mechanism.
203 // This issue is tracking making some of this stuff public:
204 // https://github.com/serde-rs/serde/issues/741
208 use __private
::size_hint
;
209 use actually_private
;
211 self, Deserialize
, DeserializeSeed
, Deserializer
, EnumAccess
, Expected
, IgnoredAny
,
212 MapAccess
, SeqAccess
, Unexpected
, Visitor
,
215 /// Used from generated code to buffer the contents of the Deserializer when
216 /// deserializing untagged enums and internally tagged enums.
218 /// Not public API. Use serde-value instead.
219 #[derive(Debug, Clone)]
220 pub enum Content
<'de
> {
243 Some(Box
<Content
<'de
>>),
246 Newtype(Box
<Content
<'de
>>),
247 Seq(Vec
<Content
<'de
>>),
248 Map(Vec
<(Content
<'de
>, Content
<'de
>)>),
251 impl<'de
> Content
<'de
> {
252 pub fn as_str(&self) -> Option
<&str> {
254 Content
::Str(x
) => Some(x
),
255 Content
::String(ref x
) => Some(x
),
256 Content
::Bytes(x
) => str::from_utf8(x
).ok(),
257 Content
::ByteBuf(ref x
) => str::from_utf8(x
).ok(),
263 fn unexpected(&self) -> Unexpected
{
265 Content
::Bool(b
) => Unexpected
::Bool(b
),
266 Content
::U8(n
) => Unexpected
::Unsigned(n
as u64),
267 Content
::U16(n
) => Unexpected
::Unsigned(n
as u64),
268 Content
::U32(n
) => Unexpected
::Unsigned(n
as u64),
269 Content
::U64(n
) => Unexpected
::Unsigned(n
),
270 Content
::I8(n
) => Unexpected
::Signed(n
as i64),
271 Content
::I16(n
) => Unexpected
::Signed(n
as i64),
272 Content
::I32(n
) => Unexpected
::Signed(n
as i64),
273 Content
::I64(n
) => Unexpected
::Signed(n
),
274 Content
::F32(f
) => Unexpected
::Float(f
as f64),
275 Content
::F64(f
) => Unexpected
::Float(f
),
276 Content
::Char(c
) => Unexpected
::Char(c
),
277 Content
::String(ref s
) => Unexpected
::Str(s
),
278 Content
::Str(s
) => Unexpected
::Str(s
),
279 Content
::ByteBuf(ref b
) => Unexpected
::Bytes(b
),
280 Content
::Bytes(b
) => Unexpected
::Bytes(b
),
281 Content
::None
| Content
::Some(_
) => Unexpected
::Option
,
282 Content
::Unit
=> Unexpected
::Unit
,
283 Content
::Newtype(_
) => Unexpected
::NewtypeStruct
,
284 Content
::Seq(_
) => Unexpected
::Seq
,
285 Content
::Map(_
) => Unexpected
::Map
,
290 impl<'de
> Deserialize
<'de
> for Content
<'de
> {
291 fn deserialize
<D
>(deserializer
: D
) -> Result
<Self, D
::Error
>
293 D
: Deserializer
<'de
>,
295 // Untagged and internally tagged enums are only supported in
296 // self-describing formats.
297 let visitor
= ContentVisitor { value: PhantomData }
;
298 deserializer
.__deserialize_content(actually_private
::T
, visitor
)
302 struct ContentVisitor
<'de
> {
303 value
: PhantomData
<Content
<'de
>>,
306 impl<'de
> ContentVisitor
<'de
> {
308 ContentVisitor { value: PhantomData }
312 impl<'de
> Visitor
<'de
> for ContentVisitor
<'de
> {
313 type Value
= Content
<'de
>;
315 fn expecting(&self, fmt
: &mut fmt
::Formatter
) -> fmt
::Result
{
316 fmt
.write_str("any value")
319 fn visit_bool
<F
>(self, value
: bool
) -> Result
<Self::Value
, F
>
323 Ok(Content
::Bool(value
))
326 fn visit_i8
<F
>(self, value
: i8) -> Result
<Self::Value
, F
>
330 Ok(Content
::I8(value
))
333 fn visit_i16
<F
>(self, value
: i16) -> Result
<Self::Value
, F
>
337 Ok(Content
::I16(value
))
340 fn visit_i32
<F
>(self, value
: i32) -> Result
<Self::Value
, F
>
344 Ok(Content
::I32(value
))
347 fn visit_i64
<F
>(self, value
: i64) -> Result
<Self::Value
, F
>
351 Ok(Content
::I64(value
))
354 fn visit_u8
<F
>(self, value
: u8) -> Result
<Self::Value
, F
>
358 Ok(Content
::U8(value
))
361 fn visit_u16
<F
>(self, value
: u16) -> Result
<Self::Value
, F
>
365 Ok(Content
::U16(value
))
368 fn visit_u32
<F
>(self, value
: u32) -> Result
<Self::Value
, F
>
372 Ok(Content
::U32(value
))
375 fn visit_u64
<F
>(self, value
: u64) -> Result
<Self::Value
, F
>
379 Ok(Content
::U64(value
))
382 fn visit_f32
<F
>(self, value
: f32) -> Result
<Self::Value
, F
>
386 Ok(Content
::F32(value
))
389 fn visit_f64
<F
>(self, value
: f64) -> Result
<Self::Value
, F
>
393 Ok(Content
::F64(value
))
396 fn visit_char
<F
>(self, value
: char) -> Result
<Self::Value
, F
>
400 Ok(Content
::Char(value
))
403 fn visit_str
<F
>(self, value
: &str) -> Result
<Self::Value
, F
>
407 Ok(Content
::String(value
.into()))
410 fn visit_borrowed_str
<F
>(self, value
: &'de
str) -> Result
<Self::Value
, F
>
414 Ok(Content
::Str(value
))
417 fn visit_string
<F
>(self, value
: String
) -> Result
<Self::Value
, F
>
421 Ok(Content
::String(value
))
424 fn visit_bytes
<F
>(self, value
: &[u8]) -> Result
<Self::Value
, F
>
428 Ok(Content
::ByteBuf(value
.into()))
431 fn visit_borrowed_bytes
<F
>(self, value
: &'de
[u8]) -> Result
<Self::Value
, F
>
435 Ok(Content
::Bytes(value
))
438 fn visit_byte_buf
<F
>(self, value
: Vec
<u8>) -> Result
<Self::Value
, F
>
442 Ok(Content
::ByteBuf(value
))
445 fn visit_unit
<F
>(self) -> Result
<Self::Value
, F
>
452 fn visit_none
<F
>(self) -> Result
<Self::Value
, F
>
459 fn visit_some
<D
>(self, deserializer
: D
) -> Result
<Self::Value
, D
::Error
>
461 D
: Deserializer
<'de
>,
463 Deserialize
::deserialize(deserializer
).map(|v
| Content
::Some(Box
::new(v
)))
466 fn visit_newtype_struct
<D
>(self, deserializer
: D
) -> Result
<Self::Value
, D
::Error
>
468 D
: Deserializer
<'de
>,
470 Deserialize
::deserialize(deserializer
).map(|v
| Content
::Newtype(Box
::new(v
)))
473 fn visit_seq
<V
>(self, mut visitor
: V
) -> Result
<Self::Value
, V
::Error
>
477 let mut vec
= Vec
::with_capacity(size_hint
::cautious(visitor
.size_hint()));
478 while let Some(e
) = try
!(visitor
.next_element()) {
481 Ok(Content
::Seq(vec
))
484 fn visit_map
<V
>(self, mut visitor
: V
) -> Result
<Self::Value
, V
::Error
>
488 let mut vec
= Vec
::with_capacity(size_hint
::cautious(visitor
.size_hint()));
489 while let Some(kv
) = try
!(visitor
.next_entry()) {
492 Ok(Content
::Map(vec
))
495 fn visit_enum
<V
>(self, _visitor
: V
) -> Result
<Self::Value
, V
::Error
>
499 Err(de
::Error
::custom(
500 "untagged and internally tagged enums do not support enum input",
505 /// This is the type of the map keys in an internally tagged enum.
508 pub enum TagOrContent
<'de
> {
510 Content(Content
<'de
>),
513 struct TagOrContentVisitor
<'de
> {
515 value
: PhantomData
<TagOrContent
<'de
>>,
518 impl<'de
> TagOrContentVisitor
<'de
> {
519 fn new(name
: &'
static str) -> Self {
520 TagOrContentVisitor
{
527 impl<'de
> DeserializeSeed
<'de
> for TagOrContentVisitor
<'de
> {
528 type Value
= TagOrContent
<'de
>;
530 fn deserialize
<D
>(self, deserializer
: D
) -> Result
<Self::Value
, D
::Error
>
532 D
: Deserializer
<'de
>,
534 // Internally tagged enums are only supported in self-describing
536 deserializer
.deserialize_any(self)
540 impl<'de
> Visitor
<'de
> for TagOrContentVisitor
<'de
> {
541 type Value
= TagOrContent
<'de
>;
543 fn expecting(&self, fmt
: &mut fmt
::Formatter
) -> fmt
::Result
{
544 write
!(fmt
, "a type tag `{}` or any other value", self.name
)
547 fn visit_bool
<F
>(self, value
: bool
) -> Result
<Self::Value
, F
>
551 ContentVisitor
::new()
553 .map(TagOrContent
::Content
)
556 fn visit_i8
<F
>(self, value
: i8) -> Result
<Self::Value
, F
>
560 ContentVisitor
::new()
562 .map(TagOrContent
::Content
)
565 fn visit_i16
<F
>(self, value
: i16) -> Result
<Self::Value
, F
>
569 ContentVisitor
::new()
571 .map(TagOrContent
::Content
)
574 fn visit_i32
<F
>(self, value
: i32) -> Result
<Self::Value
, F
>
578 ContentVisitor
::new()
580 .map(TagOrContent
::Content
)
583 fn visit_i64
<F
>(self, value
: i64) -> Result
<Self::Value
, F
>
587 ContentVisitor
::new()
589 .map(TagOrContent
::Content
)
592 fn visit_u8
<F
>(self, value
: u8) -> Result
<Self::Value
, F
>
596 ContentVisitor
::new()
598 .map(TagOrContent
::Content
)
601 fn visit_u16
<F
>(self, value
: u16) -> Result
<Self::Value
, F
>
605 ContentVisitor
::new()
607 .map(TagOrContent
::Content
)
610 fn visit_u32
<F
>(self, value
: u32) -> Result
<Self::Value
, F
>
614 ContentVisitor
::new()
616 .map(TagOrContent
::Content
)
619 fn visit_u64
<F
>(self, value
: u64) -> Result
<Self::Value
, F
>
623 ContentVisitor
::new()
625 .map(TagOrContent
::Content
)
628 fn visit_f32
<F
>(self, value
: f32) -> Result
<Self::Value
, F
>
632 ContentVisitor
::new()
634 .map(TagOrContent
::Content
)
637 fn visit_f64
<F
>(self, value
: f64) -> Result
<Self::Value
, F
>
641 ContentVisitor
::new()
643 .map(TagOrContent
::Content
)
646 fn visit_char
<F
>(self, value
: char) -> Result
<Self::Value
, F
>
650 ContentVisitor
::new()
652 .map(TagOrContent
::Content
)
655 fn visit_str
<F
>(self, value
: &str) -> Result
<Self::Value
, F
>
659 if value
== self.name
{
660 Ok(TagOrContent
::Tag
)
662 ContentVisitor
::new()
664 .map(TagOrContent
::Content
)
668 fn visit_borrowed_str
<F
>(self, value
: &'de
str) -> Result
<Self::Value
, F
>
672 if value
== self.name
{
673 Ok(TagOrContent
::Tag
)
675 ContentVisitor
::new()
676 .visit_borrowed_str(value
)
677 .map(TagOrContent
::Content
)
681 fn visit_string
<F
>(self, value
: String
) -> Result
<Self::Value
, F
>
685 if value
== self.name
{
686 Ok(TagOrContent
::Tag
)
688 ContentVisitor
::new()
690 .map(TagOrContent
::Content
)
694 fn visit_bytes
<F
>(self, value
: &[u8]) -> Result
<Self::Value
, F
>
698 if value
== self.name
.as_bytes() {
699 Ok(TagOrContent
::Tag
)
701 ContentVisitor
::new()
703 .map(TagOrContent
::Content
)
707 fn visit_borrowed_bytes
<F
>(self, value
: &'de
[u8]) -> Result
<Self::Value
, F
>
711 if value
== self.name
.as_bytes() {
712 Ok(TagOrContent
::Tag
)
714 ContentVisitor
::new()
715 .visit_borrowed_bytes(value
)
716 .map(TagOrContent
::Content
)
720 fn visit_byte_buf
<F
>(self, value
: Vec
<u8>) -> Result
<Self::Value
, F
>
724 if value
== self.name
.as_bytes() {
725 Ok(TagOrContent
::Tag
)
727 ContentVisitor
::new()
728 .visit_byte_buf(value
)
729 .map(TagOrContent
::Content
)
733 fn visit_unit
<F
>(self) -> Result
<Self::Value
, F
>
737 ContentVisitor
::new()
739 .map(TagOrContent
::Content
)
742 fn visit_none
<F
>(self) -> Result
<Self::Value
, F
>
746 ContentVisitor
::new()
748 .map(TagOrContent
::Content
)
751 fn visit_some
<D
>(self, deserializer
: D
) -> Result
<Self::Value
, D
::Error
>
753 D
: Deserializer
<'de
>,
755 ContentVisitor
::new()
756 .visit_some(deserializer
)
757 .map(TagOrContent
::Content
)
760 fn visit_newtype_struct
<D
>(self, deserializer
: D
) -> Result
<Self::Value
, D
::Error
>
762 D
: Deserializer
<'de
>,
764 ContentVisitor
::new()
765 .visit_newtype_struct(deserializer
)
766 .map(TagOrContent
::Content
)
769 fn visit_seq
<V
>(self, visitor
: V
) -> Result
<Self::Value
, V
::Error
>
773 ContentVisitor
::new()
775 .map(TagOrContent
::Content
)
778 fn visit_map
<V
>(self, visitor
: V
) -> Result
<Self::Value
, V
::Error
>
782 ContentVisitor
::new()
784 .map(TagOrContent
::Content
)
787 fn visit_enum
<V
>(self, visitor
: V
) -> Result
<Self::Value
, V
::Error
>
791 ContentVisitor
::new()
793 .map(TagOrContent
::Content
)
797 /// Used by generated code to deserialize an internally tagged enum.
800 pub struct TaggedContent
<'de
, T
> {
802 pub content
: Content
<'de
>,
806 pub struct TaggedContentVisitor
<'de
, T
> {
807 tag_name
: &'
static str,
808 expecting
: &'
static str,
809 value
: PhantomData
<TaggedContent
<'de
, T
>>,
812 impl<'de
, T
> TaggedContentVisitor
<'de
, T
> {
813 /// Visitor for the content of an internally tagged enum with the given
815 pub fn new(name
: &'
static str, expecting
: &'
static str) -> Self {
816 TaggedContentVisitor
{
818 expecting
: expecting
,
824 impl<'de
, T
> DeserializeSeed
<'de
> for TaggedContentVisitor
<'de
, T
>
828 type Value
= TaggedContent
<'de
, T
>;
830 fn deserialize
<D
>(self, deserializer
: D
) -> Result
<Self::Value
, D
::Error
>
832 D
: Deserializer
<'de
>,
834 // Internally tagged enums are only supported in self-describing
836 deserializer
.deserialize_any(self)
840 impl<'de
, T
> Visitor
<'de
> for TaggedContentVisitor
<'de
, T
>
844 type Value
= TaggedContent
<'de
, T
>;
846 fn expecting(&self, fmt
: &mut fmt
::Formatter
) -> fmt
::Result
{
847 fmt
.write_str(self.expecting
)
850 fn visit_seq
<S
>(self, mut seq
: S
) -> Result
<Self::Value
, S
::Error
>
854 let tag
= match try
!(seq
.next_element()) {
857 return Err(de
::Error
::missing_field(self.tag_name
));
860 let rest
= de
::value
::SeqAccessDeserializer
::new(seq
);
863 content
: try
!(Content
::deserialize(rest
)),
867 fn visit_map
<M
>(self, mut map
: M
) -> Result
<Self::Value
, M
::Error
>
872 let mut vec
= Vec
::with_capacity(size_hint
::cautious(map
.size_hint()));
873 while let Some(k
) = try
!(map
.next_key_seed(TagOrContentVisitor
::new(self.tag_name
))) {
875 TagOrContent
::Tag
=> {
877 return Err(de
::Error
::duplicate_field(self.tag_name
));
879 tag
= Some(try
!(map
.next_value()));
881 TagOrContent
::Content(k
) => {
882 let v
= try
!(map
.next_value());
888 None
=> Err(de
::Error
::missing_field(self.tag_name
)),
889 Some(tag
) => Ok(TaggedContent
{
891 content
: Content
::Map(vec
),
897 /// Used by generated code to deserialize an adjacently tagged enum.
900 pub enum TagOrContentField
{
906 pub struct TagOrContentFieldVisitor
{
907 pub tag
: &'
static str,
908 pub content
: &'
static str,
911 impl<'de
> DeserializeSeed
<'de
> for TagOrContentFieldVisitor
{
912 type Value
= TagOrContentField
;
914 fn deserialize
<D
>(self, deserializer
: D
) -> Result
<Self::Value
, D
::Error
>
916 D
: Deserializer
<'de
>,
918 deserializer
.deserialize_str(self)
922 impl<'de
> Visitor
<'de
> for TagOrContentFieldVisitor
{
923 type Value
= TagOrContentField
;
925 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
926 write
!(formatter
, "{:?} or {:?}", self.tag
, self.content
)
929 fn visit_str
<E
>(self, field
: &str) -> Result
<Self::Value
, E
>
933 if field
== self.tag
{
934 Ok(TagOrContentField
::Tag
)
935 } else if field
== self.content
{
936 Ok(TagOrContentField
::Content
)
938 Err(de
::Error
::invalid_value(Unexpected
::Str(field
), &self))
943 /// Used by generated code to deserialize an adjacently tagged enum when
944 /// ignoring unrelated fields is allowed.
947 pub enum TagContentOtherField
{
954 pub struct TagContentOtherFieldVisitor
{
955 pub tag
: &'
static str,
956 pub content
: &'
static str,
959 impl<'de
> DeserializeSeed
<'de
> for TagContentOtherFieldVisitor
{
960 type Value
= TagContentOtherField
;
962 fn deserialize
<D
>(self, deserializer
: D
) -> Result
<Self::Value
, D
::Error
>
964 D
: Deserializer
<'de
>,
966 deserializer
.deserialize_str(self)
970 impl<'de
> Visitor
<'de
> for TagContentOtherFieldVisitor
{
971 type Value
= TagContentOtherField
;
973 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
976 "{:?}, {:?}, or other ignored fields",
977 self.tag
, self.content
981 fn visit_str
<E
>(self, field
: &str) -> Result
<Self::Value
, E
>
985 if field
== self.tag
{
986 Ok(TagContentOtherField
::Tag
)
987 } else if field
== self.content
{
988 Ok(TagContentOtherField
::Content
)
990 Ok(TagContentOtherField
::Other
)
996 pub struct ContentDeserializer
<'de
, E
> {
997 content
: Content
<'de
>,
1001 impl<'de
, E
> ContentDeserializer
<'de
, E
>
1006 fn invalid_type(self, exp
: &Expected
) -> E
{
1007 de
::Error
::invalid_type(self.content
.unexpected(), exp
)
1010 fn deserialize_integer
<V
>(self, visitor
: V
) -> Result
<V
::Value
, E
>
1014 match self.content
{
1015 Content
::U8(v
) => visitor
.visit_u8(v
),
1016 Content
::U16(v
) => visitor
.visit_u16(v
),
1017 Content
::U32(v
) => visitor
.visit_u32(v
),
1018 Content
::U64(v
) => visitor
.visit_u64(v
),
1019 Content
::I8(v
) => visitor
.visit_i8(v
),
1020 Content
::I16(v
) => visitor
.visit_i16(v
),
1021 Content
::I32(v
) => visitor
.visit_i32(v
),
1022 Content
::I64(v
) => visitor
.visit_i64(v
),
1023 _
=> Err(self.invalid_type(&visitor
)),
1027 fn deserialize_float
<V
>(self, visitor
: V
) -> Result
<V
::Value
, E
>
1031 match self.content
{
1032 Content
::F32(v
) => visitor
.visit_f32(v
),
1033 Content
::F64(v
) => visitor
.visit_f64(v
),
1034 Content
::U8(v
) => visitor
.visit_u8(v
),
1035 Content
::U16(v
) => visitor
.visit_u16(v
),
1036 Content
::U32(v
) => visitor
.visit_u32(v
),
1037 Content
::U64(v
) => visitor
.visit_u64(v
),
1038 Content
::I8(v
) => visitor
.visit_i8(v
),
1039 Content
::I16(v
) => visitor
.visit_i16(v
),
1040 Content
::I32(v
) => visitor
.visit_i32(v
),
1041 Content
::I64(v
) => visitor
.visit_i64(v
),
1042 _
=> Err(self.invalid_type(&visitor
)),
1047 fn visit_content_seq
<'de
, V
, E
>(content
: Vec
<Content
<'de
>>, visitor
: V
) -> Result
<V
::Value
, E
>
1052 let seq
= content
.into_iter().map(ContentDeserializer
::new
);
1053 let mut seq_visitor
= de
::value
::SeqDeserializer
::new(seq
);
1054 let value
= try
!(visitor
.visit_seq(&mut seq_visitor
));
1055 try
!(seq_visitor
.end());
1059 fn visit_content_map
<'de
, V
, E
>(
1060 content
: Vec
<(Content
<'de
>, Content
<'de
>)>,
1062 ) -> Result
<V
::Value
, E
>
1069 .map(|(k
, v
)| (ContentDeserializer
::new(k
), ContentDeserializer
::new(v
)));
1070 let mut map_visitor
= de
::value
::MapDeserializer
::new(map
);
1071 let value
= try
!(visitor
.visit_map(&mut map_visitor
));
1072 try
!(map_visitor
.end());
1076 /// Used when deserializing an internally tagged enum because the content
1077 /// will be used exactly once.
1078 impl<'de
, E
> Deserializer
<'de
> for ContentDeserializer
<'de
, E
>
1084 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1088 match self.content
{
1089 Content
::Bool(v
) => visitor
.visit_bool(v
),
1090 Content
::U8(v
) => visitor
.visit_u8(v
),
1091 Content
::U16(v
) => visitor
.visit_u16(v
),
1092 Content
::U32(v
) => visitor
.visit_u32(v
),
1093 Content
::U64(v
) => visitor
.visit_u64(v
),
1094 Content
::I8(v
) => visitor
.visit_i8(v
),
1095 Content
::I16(v
) => visitor
.visit_i16(v
),
1096 Content
::I32(v
) => visitor
.visit_i32(v
),
1097 Content
::I64(v
) => visitor
.visit_i64(v
),
1098 Content
::F32(v
) => visitor
.visit_f32(v
),
1099 Content
::F64(v
) => visitor
.visit_f64(v
),
1100 Content
::Char(v
) => visitor
.visit_char(v
),
1101 Content
::String(v
) => visitor
.visit_string(v
),
1102 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
1103 Content
::ByteBuf(v
) => visitor
.visit_byte_buf(v
),
1104 Content
::Bytes(v
) => visitor
.visit_borrowed_bytes(v
),
1105 Content
::Unit
=> visitor
.visit_unit(),
1106 Content
::None
=> visitor
.visit_none(),
1107 Content
::Some(v
) => visitor
.visit_some(ContentDeserializer
::new(*v
)),
1108 Content
::Newtype(v
) => visitor
.visit_newtype_struct(ContentDeserializer
::new(*v
)),
1109 Content
::Seq(v
) => visit_content_seq(v
, visitor
),
1110 Content
::Map(v
) => visit_content_map(v
, visitor
),
1114 fn deserialize_bool
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1118 match self.content
{
1119 Content
::Bool(v
) => visitor
.visit_bool(v
),
1120 _
=> Err(self.invalid_type(&visitor
)),
1124 fn deserialize_i8
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1128 self.deserialize_integer(visitor
)
1131 fn deserialize_i16
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1135 self.deserialize_integer(visitor
)
1138 fn deserialize_i32
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1142 self.deserialize_integer(visitor
)
1145 fn deserialize_i64
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1149 self.deserialize_integer(visitor
)
1152 fn deserialize_u8
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1156 self.deserialize_integer(visitor
)
1159 fn deserialize_u16
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1163 self.deserialize_integer(visitor
)
1166 fn deserialize_u32
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1170 self.deserialize_integer(visitor
)
1173 fn deserialize_u64
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1177 self.deserialize_integer(visitor
)
1180 fn deserialize_f32
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1184 self.deserialize_float(visitor
)
1187 fn deserialize_f64
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1191 self.deserialize_float(visitor
)
1194 fn deserialize_char
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1198 match self.content
{
1199 Content
::Char(v
) => visitor
.visit_char(v
),
1200 Content
::String(v
) => visitor
.visit_string(v
),
1201 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
1202 _
=> Err(self.invalid_type(&visitor
)),
1206 fn deserialize_str
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1210 self.deserialize_string(visitor
)
1213 fn deserialize_string
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1217 match self.content
{
1218 Content
::String(v
) => visitor
.visit_string(v
),
1219 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
1220 Content
::ByteBuf(v
) => visitor
.visit_byte_buf(v
),
1221 Content
::Bytes(v
) => visitor
.visit_borrowed_bytes(v
),
1222 _
=> Err(self.invalid_type(&visitor
)),
1226 fn deserialize_bytes
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1230 self.deserialize_byte_buf(visitor
)
1233 fn deserialize_byte_buf
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1237 match self.content
{
1238 Content
::String(v
) => visitor
.visit_string(v
),
1239 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
1240 Content
::ByteBuf(v
) => visitor
.visit_byte_buf(v
),
1241 Content
::Bytes(v
) => visitor
.visit_borrowed_bytes(v
),
1242 Content
::Seq(v
) => visit_content_seq(v
, visitor
),
1243 _
=> Err(self.invalid_type(&visitor
)),
1247 fn deserialize_option
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1251 match self.content
{
1252 Content
::None
=> visitor
.visit_none(),
1253 Content
::Some(v
) => visitor
.visit_some(ContentDeserializer
::new(*v
)),
1254 Content
::Unit
=> visitor
.visit_unit(),
1255 _
=> visitor
.visit_some(self),
1259 fn deserialize_unit
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1263 match self.content
{
1264 Content
::Unit
=> visitor
.visit_unit(),
1266 // Allow deserializing newtype variant containing unit.
1268 // #[derive(Deserialize)]
1269 // #[serde(tag = "result")]
1270 // enum Response<T> {
1274 // We want {"result":"Success"} to deserialize into Response<()>.
1275 Content
::Map(ref v
) if v
.is_empty() => visitor
.visit_unit(),
1276 _
=> Err(self.invalid_type(&visitor
)),
1280 fn deserialize_unit_struct
<V
>(
1282 _name
: &'
static str,
1284 ) -> Result
<V
::Value
, Self::Error
>
1288 match self.content
{
1289 // As a special case, allow deserializing untagged newtype
1290 // variant containing unit struct.
1292 // #[derive(Deserialize)]
1295 // #[derive(Deserialize)]
1296 // #[serde(tag = "topic")]
1301 // We want {"topic":"Info"} to deserialize even though
1302 // ordinarily unit structs do not deserialize from empty map/seq.
1303 Content
::Map(ref v
) if v
.is_empty() => visitor
.visit_unit(),
1304 Content
::Seq(ref v
) if v
.is_empty() => visitor
.visit_unit(),
1305 _
=> self.deserialize_any(visitor
),
1309 fn deserialize_newtype_struct
<V
>(
1313 ) -> Result
<V
::Value
, Self::Error
>
1317 match self.content
{
1318 Content
::Newtype(v
) => visitor
.visit_newtype_struct(ContentDeserializer
::new(*v
)),
1319 _
=> visitor
.visit_newtype_struct(self),
1323 fn deserialize_seq
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1327 match self.content
{
1328 Content
::Seq(v
) => visit_content_seq(v
, visitor
),
1329 _
=> Err(self.invalid_type(&visitor
)),
1333 fn deserialize_tuple
<V
>(self, _len
: usize, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1337 self.deserialize_seq(visitor
)
1340 fn deserialize_tuple_struct
<V
>(
1342 _name
: &'
static str,
1345 ) -> Result
<V
::Value
, Self::Error
>
1349 self.deserialize_seq(visitor
)
1352 fn deserialize_map
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1356 match self.content
{
1357 Content
::Map(v
) => visit_content_map(v
, visitor
),
1358 _
=> Err(self.invalid_type(&visitor
)),
1362 fn deserialize_struct
<V
>(
1364 _name
: &'
static str,
1365 _fields
: &'
static [&'
static str],
1367 ) -> Result
<V
::Value
, Self::Error
>
1371 match self.content
{
1372 Content
::Seq(v
) => visit_content_seq(v
, visitor
),
1373 Content
::Map(v
) => visit_content_map(v
, visitor
),
1374 _
=> Err(self.invalid_type(&visitor
)),
1378 fn deserialize_enum
<V
>(
1381 _variants
: &'
static [&'
static str],
1383 ) -> Result
<V
::Value
, Self::Error
>
1387 let (variant
, value
) = match self.content
{
1388 Content
::Map(value
) => {
1389 let mut iter
= value
.into_iter();
1390 let (variant
, value
) = match iter
.next() {
1393 return Err(de
::Error
::invalid_value(
1394 de
::Unexpected
::Map
,
1395 &"map with a single key",
1399 // enums are encoded in json as maps with a single key:value pair
1400 if iter
.next().is_some() {
1401 return Err(de
::Error
::invalid_value(
1402 de
::Unexpected
::Map
,
1403 &"map with a single key",
1406 (variant
, Some(value
))
1408 s @ Content
::String(_
) | s @ Content
::Str(_
) => (s
, None
),
1410 return Err(de
::Error
::invalid_type(
1417 visitor
.visit_enum(EnumDeserializer
::new(variant
, value
))
1420 fn deserialize_identifier
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1424 match self.content
{
1425 Content
::String(v
) => visitor
.visit_string(v
),
1426 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
1427 Content
::ByteBuf(v
) => visitor
.visit_byte_buf(v
),
1428 Content
::Bytes(v
) => visitor
.visit_borrowed_bytes(v
),
1429 Content
::U8(v
) => visitor
.visit_u8(v
),
1430 Content
::U64(v
) => visitor
.visit_u64(v
),
1431 _
=> Err(self.invalid_type(&visitor
)),
1435 fn deserialize_ignored_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1440 visitor
.visit_unit()
1443 fn __deserialize_content
<V
>(
1445 _
: actually_private
::T
,
1447 ) -> Result
<Content
<'de
>, Self::Error
>
1449 V
: Visitor
<'de
, Value
= Content
<'de
>>,
1456 impl<'de
, E
> ContentDeserializer
<'de
, E
> {
1457 /// private API, don't use
1458 pub fn new(content
: Content
<'de
>) -> Self {
1459 ContentDeserializer
{
1466 pub struct EnumDeserializer
<'de
, E
>
1470 variant
: Content
<'de
>,
1471 value
: Option
<Content
<'de
>>,
1472 err
: PhantomData
<E
>,
1475 impl<'de
, E
> EnumDeserializer
<'de
, E
>
1479 pub fn new(variant
: Content
<'de
>, value
: Option
<Content
<'de
>>) -> EnumDeserializer
<'de
, E
> {
1488 impl<'de
, E
> de
::EnumAccess
<'de
> for EnumDeserializer
<'de
, E
>
1493 type Variant
= VariantDeserializer
<'de
, Self::Error
>;
1495 fn variant_seed
<V
>(self, seed
: V
) -> Result
<(V
::Value
, Self::Variant
), E
>
1497 V
: de
::DeserializeSeed
<'de
>,
1499 let visitor
= VariantDeserializer
{
1503 seed
.deserialize(ContentDeserializer
::new(self.variant
))
1504 .map(|v
| (v
, visitor
))
1508 pub struct VariantDeserializer
<'de
, E
>
1512 value
: Option
<Content
<'de
>>,
1513 err
: PhantomData
<E
>,
1516 impl<'de
, E
> de
::VariantAccess
<'de
> for VariantDeserializer
<'de
, E
>
1522 fn unit_variant(self) -> Result
<(), E
> {
1524 Some(value
) => de
::Deserialize
::deserialize(ContentDeserializer
::new(value
)),
1529 fn newtype_variant_seed
<T
>(self, seed
: T
) -> Result
<T
::Value
, E
>
1531 T
: de
::DeserializeSeed
<'de
>,
1534 Some(value
) => seed
.deserialize(ContentDeserializer
::new(value
)),
1535 None
=> Err(de
::Error
::invalid_type(
1536 de
::Unexpected
::UnitVariant
,
1542 fn tuple_variant
<V
>(self, _len
: usize, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1544 V
: de
::Visitor
<'de
>,
1547 Some(Content
::Seq(v
)) => {
1548 de
::Deserializer
::deserialize_any(SeqDeserializer
::new(v
), visitor
)
1550 Some(other
) => Err(de
::Error
::invalid_type(
1554 None
=> Err(de
::Error
::invalid_type(
1555 de
::Unexpected
::UnitVariant
,
1561 fn struct_variant
<V
>(
1563 _fields
: &'
static [&'
static str],
1565 ) -> Result
<V
::Value
, Self::Error
>
1567 V
: de
::Visitor
<'de
>,
1570 Some(Content
::Map(v
)) => {
1571 de
::Deserializer
::deserialize_any(MapDeserializer
::new(v
), visitor
)
1573 Some(Content
::Seq(v
)) => {
1574 de
::Deserializer
::deserialize_any(SeqDeserializer
::new(v
), visitor
)
1576 Some(other
) => Err(de
::Error
::invalid_type(
1580 None
=> Err(de
::Error
::invalid_type(
1581 de
::Unexpected
::UnitVariant
,
1588 struct SeqDeserializer
<'de
, E
>
1592 iter
: <Vec
<Content
<'de
>> as IntoIterator
>::IntoIter
,
1593 err
: PhantomData
<E
>,
1596 impl<'de
, E
> SeqDeserializer
<'de
, E
>
1600 fn new(vec
: Vec
<Content
<'de
>>) -> Self {
1602 iter
: vec
.into_iter(),
1608 impl<'de
, E
> de
::Deserializer
<'de
> for SeqDeserializer
<'de
, E
>
1615 fn deserialize_any
<V
>(mut self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1617 V
: de
::Visitor
<'de
>,
1619 let len
= self.iter
.len();
1621 visitor
.visit_unit()
1623 let ret
= try
!(visitor
.visit_seq(&mut self));
1624 let remaining
= self.iter
.len();
1628 Err(de
::Error
::invalid_length(len
, &"fewer elements in array"))
1633 forward_to_deserialize_any
! {
1634 bool
i8 i16 i32 i64 i128
u8 u16 u32 u64 u128
f32 f64 char str string
1635 bytes byte_buf option unit unit_struct newtype_struct seq tuple
1636 tuple_struct map
struct enum identifier ignored_any
1640 impl<'de
, E
> de
::SeqAccess
<'de
> for SeqDeserializer
<'de
, E
>
1646 fn next_element_seed
<T
>(&mut self, seed
: T
) -> Result
<Option
<T
::Value
>, Self::Error
>
1648 T
: de
::DeserializeSeed
<'de
>,
1650 match self.iter
.next() {
1651 Some(value
) => seed
.deserialize(ContentDeserializer
::new(value
)).map(Some
),
1656 fn size_hint(&self) -> Option
<usize> {
1657 size_hint
::from_bounds(&self.iter
)
1661 struct MapDeserializer
<'de
, E
>
1665 iter
: <Vec
<(Content
<'de
>, Content
<'de
>)> as IntoIterator
>::IntoIter
,
1666 value
: Option
<Content
<'de
>>,
1667 err
: PhantomData
<E
>,
1670 impl<'de
, E
> MapDeserializer
<'de
, E
>
1674 fn new(map
: Vec
<(Content
<'de
>, Content
<'de
>)>) -> Self {
1676 iter
: map
.into_iter(),
1683 impl<'de
, E
> de
::MapAccess
<'de
> for MapDeserializer
<'de
, E
>
1689 fn next_key_seed
<T
>(&mut self, seed
: T
) -> Result
<Option
<T
::Value
>, Self::Error
>
1691 T
: de
::DeserializeSeed
<'de
>,
1693 match self.iter
.next() {
1694 Some((key
, value
)) => {
1695 self.value
= Some(value
);
1696 seed
.deserialize(ContentDeserializer
::new(key
)).map(Some
)
1702 fn next_value_seed
<T
>(&mut self, seed
: T
) -> Result
<T
::Value
, Self::Error
>
1704 T
: de
::DeserializeSeed
<'de
>,
1706 match self.value
.take() {
1707 Some(value
) => seed
.deserialize(ContentDeserializer
::new(value
)),
1708 None
=> Err(de
::Error
::custom("value is missing")),
1712 fn size_hint(&self) -> Option
<usize> {
1713 size_hint
::from_bounds(&self.iter
)
1717 impl<'de
, E
> de
::Deserializer
<'de
> for MapDeserializer
<'de
, E
>
1724 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1726 V
: de
::Visitor
<'de
>,
1728 visitor
.visit_map(self)
1731 forward_to_deserialize_any
! {
1732 bool
i8 i16 i32 i64 i128
u8 u16 u32 u64 u128
f32 f64 char str string
1733 bytes byte_buf option unit unit_struct newtype_struct seq tuple
1734 tuple_struct map
struct enum identifier ignored_any
1739 pub struct ContentRefDeserializer
<'a
, 'de
: 'a
, E
> {
1740 content
: &'a Content
<'de
>,
1741 err
: PhantomData
<E
>,
1744 impl<'a
, 'de
, E
> ContentRefDeserializer
<'a
, 'de
, E
>
1749 fn invalid_type(self, exp
: &Expected
) -> E
{
1750 de
::Error
::invalid_type(self.content
.unexpected(), exp
)
1753 fn deserialize_integer
<V
>(self, visitor
: V
) -> Result
<V
::Value
, E
>
1757 match *self.content
{
1758 Content
::U8(v
) => visitor
.visit_u8(v
),
1759 Content
::U16(v
) => visitor
.visit_u16(v
),
1760 Content
::U32(v
) => visitor
.visit_u32(v
),
1761 Content
::U64(v
) => visitor
.visit_u64(v
),
1762 Content
::I8(v
) => visitor
.visit_i8(v
),
1763 Content
::I16(v
) => visitor
.visit_i16(v
),
1764 Content
::I32(v
) => visitor
.visit_i32(v
),
1765 Content
::I64(v
) => visitor
.visit_i64(v
),
1766 _
=> Err(self.invalid_type(&visitor
)),
1770 fn deserialize_float
<V
>(self, visitor
: V
) -> Result
<V
::Value
, E
>
1774 match *self.content
{
1775 Content
::F32(v
) => visitor
.visit_f32(v
),
1776 Content
::F64(v
) => visitor
.visit_f64(v
),
1777 Content
::U8(v
) => visitor
.visit_u8(v
),
1778 Content
::U16(v
) => visitor
.visit_u16(v
),
1779 Content
::U32(v
) => visitor
.visit_u32(v
),
1780 Content
::U64(v
) => visitor
.visit_u64(v
),
1781 Content
::I8(v
) => visitor
.visit_i8(v
),
1782 Content
::I16(v
) => visitor
.visit_i16(v
),
1783 Content
::I32(v
) => visitor
.visit_i32(v
),
1784 Content
::I64(v
) => visitor
.visit_i64(v
),
1785 _
=> Err(self.invalid_type(&visitor
)),
1790 fn visit_content_seq_ref
<'a
, 'de
, V
, E
>(
1791 content
: &'a
[Content
<'de
>],
1793 ) -> Result
<V
::Value
, E
>
1798 let seq
= content
.iter().map(ContentRefDeserializer
::new
);
1799 let mut seq_visitor
= de
::value
::SeqDeserializer
::new(seq
);
1800 let value
= try
!(visitor
.visit_seq(&mut seq_visitor
));
1801 try
!(seq_visitor
.end());
1805 fn visit_content_map_ref
<'a
, 'de
, V
, E
>(
1806 content
: &'a
[(Content
<'de
>, Content
<'de
>)],
1808 ) -> Result
<V
::Value
, E
>
1813 let map
= content
.iter().map(|(k
, v
)| {
1815 ContentRefDeserializer
::new(k
),
1816 ContentRefDeserializer
::new(v
),
1819 let mut map_visitor
= de
::value
::MapDeserializer
::new(map
);
1820 let value
= try
!(visitor
.visit_map(&mut map_visitor
));
1821 try
!(map_visitor
.end());
1825 /// Used when deserializing an untagged enum because the content may need
1826 /// to be used more than once.
1827 impl<'de
, 'a
, E
> Deserializer
<'de
> for ContentRefDeserializer
<'a
, 'de
, E
>
1833 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, E
>
1837 match *self.content
{
1838 Content
::Bool(v
) => visitor
.visit_bool(v
),
1839 Content
::U8(v
) => visitor
.visit_u8(v
),
1840 Content
::U16(v
) => visitor
.visit_u16(v
),
1841 Content
::U32(v
) => visitor
.visit_u32(v
),
1842 Content
::U64(v
) => visitor
.visit_u64(v
),
1843 Content
::I8(v
) => visitor
.visit_i8(v
),
1844 Content
::I16(v
) => visitor
.visit_i16(v
),
1845 Content
::I32(v
) => visitor
.visit_i32(v
),
1846 Content
::I64(v
) => visitor
.visit_i64(v
),
1847 Content
::F32(v
) => visitor
.visit_f32(v
),
1848 Content
::F64(v
) => visitor
.visit_f64(v
),
1849 Content
::Char(v
) => visitor
.visit_char(v
),
1850 Content
::String(ref v
) => visitor
.visit_str(v
),
1851 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
1852 Content
::ByteBuf(ref v
) => visitor
.visit_bytes(v
),
1853 Content
::Bytes(v
) => visitor
.visit_borrowed_bytes(v
),
1854 Content
::Unit
=> visitor
.visit_unit(),
1855 Content
::None
=> visitor
.visit_none(),
1856 Content
::Some(ref v
) => visitor
.visit_some(ContentRefDeserializer
::new(v
)),
1857 Content
::Newtype(ref v
) => {
1858 visitor
.visit_newtype_struct(ContentRefDeserializer
::new(v
))
1860 Content
::Seq(ref v
) => visit_content_seq_ref(v
, visitor
),
1861 Content
::Map(ref v
) => visit_content_map_ref(v
, visitor
),
1865 fn deserialize_bool
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1869 match *self.content
{
1870 Content
::Bool(v
) => visitor
.visit_bool(v
),
1871 _
=> Err(self.invalid_type(&visitor
)),
1875 fn deserialize_i8
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1879 self.deserialize_integer(visitor
)
1882 fn deserialize_i16
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1886 self.deserialize_integer(visitor
)
1889 fn deserialize_i32
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1893 self.deserialize_integer(visitor
)
1896 fn deserialize_i64
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1900 self.deserialize_integer(visitor
)
1903 fn deserialize_u8
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1907 self.deserialize_integer(visitor
)
1910 fn deserialize_u16
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1914 self.deserialize_integer(visitor
)
1917 fn deserialize_u32
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1921 self.deserialize_integer(visitor
)
1924 fn deserialize_u64
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1928 self.deserialize_integer(visitor
)
1931 fn deserialize_f32
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1935 self.deserialize_float(visitor
)
1938 fn deserialize_f64
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1942 self.deserialize_float(visitor
)
1945 fn deserialize_char
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1949 match *self.content
{
1950 Content
::Char(v
) => visitor
.visit_char(v
),
1951 Content
::String(ref v
) => visitor
.visit_str(v
),
1952 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
1953 _
=> Err(self.invalid_type(&visitor
)),
1957 fn deserialize_str
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1961 match *self.content
{
1962 Content
::String(ref v
) => visitor
.visit_str(v
),
1963 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
1964 Content
::ByteBuf(ref v
) => visitor
.visit_bytes(v
),
1965 Content
::Bytes(v
) => visitor
.visit_borrowed_bytes(v
),
1966 _
=> Err(self.invalid_type(&visitor
)),
1970 fn deserialize_string
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1974 self.deserialize_str(visitor
)
1977 fn deserialize_bytes
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1981 match *self.content
{
1982 Content
::String(ref v
) => visitor
.visit_str(v
),
1983 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
1984 Content
::ByteBuf(ref v
) => visitor
.visit_bytes(v
),
1985 Content
::Bytes(v
) => visitor
.visit_borrowed_bytes(v
),
1986 Content
::Seq(ref v
) => visit_content_seq_ref(v
, visitor
),
1987 _
=> Err(self.invalid_type(&visitor
)),
1991 fn deserialize_byte_buf
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
1995 self.deserialize_bytes(visitor
)
1998 fn deserialize_option
<V
>(self, visitor
: V
) -> Result
<V
::Value
, E
>
2002 match *self.content
{
2003 Content
::None
=> visitor
.visit_none(),
2004 Content
::Some(ref v
) => visitor
.visit_some(ContentRefDeserializer
::new(v
)),
2005 Content
::Unit
=> visitor
.visit_unit(),
2006 _
=> visitor
.visit_some(self),
2010 fn deserialize_unit
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2014 match *self.content
{
2015 Content
::Unit
=> visitor
.visit_unit(),
2016 _
=> Err(self.invalid_type(&visitor
)),
2020 fn deserialize_unit_struct
<V
>(
2022 _name
: &'
static str,
2024 ) -> Result
<V
::Value
, Self::Error
>
2028 self.deserialize_unit(visitor
)
2031 fn deserialize_newtype_struct
<V
>(self, _name
: &str, visitor
: V
) -> Result
<V
::Value
, E
>
2035 match *self.content
{
2036 Content
::Newtype(ref v
) => {
2037 visitor
.visit_newtype_struct(ContentRefDeserializer
::new(v
))
2039 _
=> visitor
.visit_newtype_struct(self),
2043 fn deserialize_seq
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2047 match *self.content
{
2048 Content
::Seq(ref v
) => visit_content_seq_ref(v
, visitor
),
2049 _
=> Err(self.invalid_type(&visitor
)),
2053 fn deserialize_tuple
<V
>(self, _len
: usize, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2057 self.deserialize_seq(visitor
)
2060 fn deserialize_tuple_struct
<V
>(
2062 _name
: &'
static str,
2065 ) -> Result
<V
::Value
, Self::Error
>
2069 self.deserialize_seq(visitor
)
2072 fn deserialize_map
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2076 match *self.content
{
2077 Content
::Map(ref v
) => visit_content_map_ref(v
, visitor
),
2078 _
=> Err(self.invalid_type(&visitor
)),
2082 fn deserialize_struct
<V
>(
2084 _name
: &'
static str,
2085 _fields
: &'
static [&'
static str],
2087 ) -> Result
<V
::Value
, Self::Error
>
2091 match *self.content
{
2092 Content
::Seq(ref v
) => visit_content_seq_ref(v
, visitor
),
2093 Content
::Map(ref v
) => visit_content_map_ref(v
, visitor
),
2094 _
=> Err(self.invalid_type(&visitor
)),
2098 fn deserialize_enum
<V
>(
2101 _variants
: &'
static [&'
static str],
2103 ) -> Result
<V
::Value
, Self::Error
>
2107 let (variant
, value
) = match *self.content
{
2108 Content
::Map(ref value
) => {
2109 let mut iter
= value
.iter();
2110 let (variant
, value
) = match iter
.next() {
2113 return Err(de
::Error
::invalid_value(
2114 de
::Unexpected
::Map
,
2115 &"map with a single key",
2119 // enums are encoded in json as maps with a single key:value pair
2120 if iter
.next().is_some() {
2121 return Err(de
::Error
::invalid_value(
2122 de
::Unexpected
::Map
,
2123 &"map with a single key",
2126 (variant
, Some(value
))
2128 ref s @ Content
::String(_
) | ref s @ Content
::Str(_
) => (s
, None
),
2130 return Err(de
::Error
::invalid_type(
2137 visitor
.visit_enum(EnumRefDeserializer
{
2144 fn deserialize_identifier
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2148 match *self.content
{
2149 Content
::String(ref v
) => visitor
.visit_str(v
),
2150 Content
::Str(v
) => visitor
.visit_borrowed_str(v
),
2151 Content
::ByteBuf(ref v
) => visitor
.visit_bytes(v
),
2152 Content
::Bytes(v
) => visitor
.visit_borrowed_bytes(v
),
2153 Content
::U8(v
) => visitor
.visit_u8(v
),
2154 Content
::U64(v
) => visitor
.visit_u64(v
),
2155 _
=> Err(self.invalid_type(&visitor
)),
2159 fn deserialize_ignored_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2163 visitor
.visit_unit()
2166 fn __deserialize_content
<V
>(
2168 _
: actually_private
::T
,
2170 ) -> Result
<Content
<'de
>, Self::Error
>
2172 V
: Visitor
<'de
, Value
= Content
<'de
>>,
2175 Ok(self.content
.clone())
2179 impl<'a
, 'de
, E
> ContentRefDeserializer
<'a
, 'de
, E
> {
2180 /// private API, don't use
2181 pub fn new(content
: &'a Content
<'de
>) -> Self {
2182 ContentRefDeserializer
{
2189 struct EnumRefDeserializer
<'a
, 'de
: 'a
, E
>
2193 variant
: &'a Content
<'de
>,
2194 value
: Option
<&'a Content
<'de
>>,
2195 err
: PhantomData
<E
>,
2198 impl<'de
, 'a
, E
> de
::EnumAccess
<'de
> for EnumRefDeserializer
<'a
, 'de
, E
>
2203 type Variant
= VariantRefDeserializer
<'a
, 'de
, Self::Error
>;
2205 fn variant_seed
<V
>(self, seed
: V
) -> Result
<(V
::Value
, Self::Variant
), Self::Error
>
2207 V
: de
::DeserializeSeed
<'de
>,
2209 let visitor
= VariantRefDeserializer
{
2213 seed
.deserialize(ContentRefDeserializer
::new(self.variant
))
2214 .map(|v
| (v
, visitor
))
2218 struct VariantRefDeserializer
<'a
, 'de
: 'a
, E
>
2222 value
: Option
<&'a Content
<'de
>>,
2223 err
: PhantomData
<E
>,
2226 impl<'de
, 'a
, E
> de
::VariantAccess
<'de
> for VariantRefDeserializer
<'a
, 'de
, E
>
2232 fn unit_variant(self) -> Result
<(), E
> {
2234 Some(value
) => de
::Deserialize
::deserialize(ContentRefDeserializer
::new(value
)),
2239 fn newtype_variant_seed
<T
>(self, seed
: T
) -> Result
<T
::Value
, E
>
2241 T
: de
::DeserializeSeed
<'de
>,
2244 Some(value
) => seed
.deserialize(ContentRefDeserializer
::new(value
)),
2245 None
=> Err(de
::Error
::invalid_type(
2246 de
::Unexpected
::UnitVariant
,
2252 fn tuple_variant
<V
>(self, _len
: usize, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2254 V
: de
::Visitor
<'de
>,
2257 Some(Content
::Seq(v
)) => {
2258 de
::Deserializer
::deserialize_any(SeqRefDeserializer
::new(v
), visitor
)
2260 Some(other
) => Err(de
::Error
::invalid_type(
2264 None
=> Err(de
::Error
::invalid_type(
2265 de
::Unexpected
::UnitVariant
,
2271 fn struct_variant
<V
>(
2273 _fields
: &'
static [&'
static str],
2275 ) -> Result
<V
::Value
, Self::Error
>
2277 V
: de
::Visitor
<'de
>,
2280 Some(Content
::Map(v
)) => {
2281 de
::Deserializer
::deserialize_any(MapRefDeserializer
::new(v
), visitor
)
2283 Some(Content
::Seq(v
)) => {
2284 de
::Deserializer
::deserialize_any(SeqRefDeserializer
::new(v
), visitor
)
2286 Some(other
) => Err(de
::Error
::invalid_type(
2290 None
=> Err(de
::Error
::invalid_type(
2291 de
::Unexpected
::UnitVariant
,
2298 struct SeqRefDeserializer
<'a
, 'de
: 'a
, E
>
2302 iter
: <&'a
[Content
<'de
>] as IntoIterator
>::IntoIter
,
2303 err
: PhantomData
<E
>,
2306 impl<'a
, 'de
, E
> SeqRefDeserializer
<'a
, 'de
, E
>
2310 fn new(slice
: &'a
[Content
<'de
>]) -> Self {
2311 SeqRefDeserializer
{
2318 impl<'de
, 'a
, E
> de
::Deserializer
<'de
> for SeqRefDeserializer
<'a
, 'de
, E
>
2325 fn deserialize_any
<V
>(mut self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2327 V
: de
::Visitor
<'de
>,
2329 let len
= self.iter
.len();
2331 visitor
.visit_unit()
2333 let ret
= try
!(visitor
.visit_seq(&mut self));
2334 let remaining
= self.iter
.len();
2338 Err(de
::Error
::invalid_length(len
, &"fewer elements in array"))
2343 forward_to_deserialize_any
! {
2344 bool
i8 i16 i32 i64 i128
u8 u16 u32 u64 u128
f32 f64 char str string
2345 bytes byte_buf option unit unit_struct newtype_struct seq tuple
2346 tuple_struct map
struct enum identifier ignored_any
2350 impl<'de
, 'a
, E
> de
::SeqAccess
<'de
> for SeqRefDeserializer
<'a
, 'de
, E
>
2356 fn next_element_seed
<T
>(&mut self, seed
: T
) -> Result
<Option
<T
::Value
>, Self::Error
>
2358 T
: de
::DeserializeSeed
<'de
>,
2360 match self.iter
.next() {
2362 .deserialize(ContentRefDeserializer
::new(value
))
2368 fn size_hint(&self) -> Option
<usize> {
2369 size_hint
::from_bounds(&self.iter
)
2373 struct MapRefDeserializer
<'a
, 'de
: 'a
, E
>
2377 iter
: <&'a
[(Content
<'de
>, Content
<'de
>)] as IntoIterator
>::IntoIter
,
2378 value
: Option
<&'a Content
<'de
>>,
2379 err
: PhantomData
<E
>,
2382 impl<'a
, 'de
, E
> MapRefDeserializer
<'a
, 'de
, E
>
2386 fn new(map
: &'a
[(Content
<'de
>, Content
<'de
>)]) -> Self {
2387 MapRefDeserializer
{
2395 impl<'de
, 'a
, E
> de
::MapAccess
<'de
> for MapRefDeserializer
<'a
, 'de
, E
>
2401 fn next_key_seed
<T
>(&mut self, seed
: T
) -> Result
<Option
<T
::Value
>, Self::Error
>
2403 T
: de
::DeserializeSeed
<'de
>,
2405 match self.iter
.next() {
2406 Some((key
, value
)) => {
2407 self.value
= Some(value
);
2408 seed
.deserialize(ContentRefDeserializer
::new(key
)).map(Some
)
2414 fn next_value_seed
<T
>(&mut self, seed
: T
) -> Result
<T
::Value
, Self::Error
>
2416 T
: de
::DeserializeSeed
<'de
>,
2418 match self.value
.take() {
2419 Some(value
) => seed
.deserialize(ContentRefDeserializer
::new(value
)),
2420 None
=> Err(de
::Error
::custom("value is missing")),
2424 fn size_hint(&self) -> Option
<usize> {
2425 size_hint
::from_bounds(&self.iter
)
2429 impl<'de
, 'a
, E
> de
::Deserializer
<'de
> for MapRefDeserializer
<'a
, 'de
, E
>
2436 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2438 V
: de
::Visitor
<'de
>,
2440 visitor
.visit_map(self)
2443 forward_to_deserialize_any
! {
2444 bool
i8 i16 i32 i64 i128
u8 u16 u32 u64 u128
f32 f64 char str string
2445 bytes byte_buf option unit unit_struct newtype_struct seq tuple
2446 tuple_struct map
struct enum identifier ignored_any
2450 impl<'de
, E
> de
::IntoDeserializer
<'de
, E
> for ContentDeserializer
<'de
, E
>
2454 type Deserializer
= Self;
2456 fn into_deserializer(self) -> Self {
2461 impl<'de
, 'a
, E
> de
::IntoDeserializer
<'de
, E
> for ContentRefDeserializer
<'a
, 'de
, E
>
2465 type Deserializer
= Self;
2467 fn into_deserializer(self) -> Self {
2472 /// Visitor for deserializing an internally tagged unit variant.
2475 pub struct InternallyTaggedUnitVisitor
<'a
> {
2477 variant_name
: &'a
str,
2480 impl<'a
> InternallyTaggedUnitVisitor
<'a
> {
2482 pub fn new(type_name
: &'a
str, variant_name
: &'a
str) -> Self {
2483 InternallyTaggedUnitVisitor
{
2484 type_name
: type_name
,
2485 variant_name
: variant_name
,
2490 impl<'de
, 'a
> Visitor
<'de
> for InternallyTaggedUnitVisitor
<'a
> {
2493 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
2496 "unit variant {}::{}",
2497 self.type_name
, self.variant_name
2501 fn visit_seq
<S
>(self, _
: S
) -> Result
<(), S
::Error
>
2508 fn visit_map
<M
>(self, mut access
: M
) -> Result
<(), M
::Error
>
2512 while try
!(access
.next_entry
::<IgnoredAny
, IgnoredAny
>()).is_some() {}
2517 /// Visitor for deserializing an untagged unit variant.
2520 pub struct UntaggedUnitVisitor
<'a
> {
2522 variant_name
: &'a
str,
2525 impl<'a
> UntaggedUnitVisitor
<'a
> {
2527 pub fn new(type_name
: &'a
str, variant_name
: &'a
str) -> Self {
2528 UntaggedUnitVisitor
{
2529 type_name
: type_name
,
2530 variant_name
: variant_name
,
2535 impl<'de
, 'a
> Visitor
<'de
> for UntaggedUnitVisitor
<'a
> {
2538 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
2541 "unit variant {}::{}",
2542 self.type_name
, self.variant_name
2546 fn visit_unit
<E
>(self) -> Result
<(), E
>
2553 fn visit_none
<E
>(self) -> Result
<(), E
>
2562 ////////////////////////////////////////////////////////////////////////////////
2564 // Like `IntoDeserializer` but also implemented for `&[u8]`. This is used for
2565 // the newtype fallthrough case of `field_identifier`.
2567 // #[derive(Deserialize)]
2568 // #[serde(field_identifier)]
2572 // Other(String), // deserialized using IdentifierDeserializer
2574 pub trait IdentifierDeserializer
<'de
, E
: Error
> {
2575 type Deserializer
: Deserializer
<'de
, Error
= E
>;
2577 fn from(self) -> Self::Deserializer
;
2580 pub struct Borrowed
<'de
, T
: 'de
+ ?Sized
>(pub &'de T
);
2582 impl<'de
, E
> IdentifierDeserializer
<'de
, E
> for u64
2586 type Deserializer
= <u64 as IntoDeserializer
<'de
, E
>>::Deserializer
;
2588 fn from(self) -> Self::Deserializer
{
2589 self.into_deserializer()
2593 pub struct StrDeserializer
<'a
, E
> {
2595 marker
: PhantomData
<E
>,
2598 impl<'de
, 'a
, E
> Deserializer
<'de
> for StrDeserializer
<'a
, E
>
2604 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2608 visitor
.visit_str(self.value
)
2611 forward_to_deserialize_any
! {
2612 bool
i8 i16 i32 i64 i128
u8 u16 u32 u64 u128
f32 f64 char str string
2613 bytes byte_buf option unit unit_struct newtype_struct seq tuple
2614 tuple_struct map
struct enum identifier ignored_any
2618 pub struct BorrowedStrDeserializer
<'de
, E
> {
2620 marker
: PhantomData
<E
>,
2623 impl<'de
, E
> Deserializer
<'de
> for BorrowedStrDeserializer
<'de
, E
>
2629 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2633 visitor
.visit_borrowed_str(self.value
)
2636 forward_to_deserialize_any
! {
2637 bool
i8 i16 i32 i64 i128
u8 u16 u32 u64 u128
f32 f64 char str string
2638 bytes byte_buf option unit unit_struct newtype_struct seq tuple
2639 tuple_struct map
struct enum identifier ignored_any
2643 impl<'a
, E
> IdentifierDeserializer
<'a
, E
> for &'a
str
2647 type Deserializer
= StrDeserializer
<'a
, E
>;
2649 fn from(self) -> Self::Deserializer
{
2652 marker
: PhantomData
,
2657 impl<'de
, E
> IdentifierDeserializer
<'de
, E
> for Borrowed
<'de
, str>
2661 type Deserializer
= BorrowedStrDeserializer
<'de
, E
>;
2663 fn from(self) -> Self::Deserializer
{
2664 BorrowedStrDeserializer
{
2666 marker
: PhantomData
,
2671 impl<'a
, E
> IdentifierDeserializer
<'a
, E
> for &'a
[u8]
2675 type Deserializer
= BytesDeserializer
<'a
, E
>;
2677 fn from(self) -> Self::Deserializer
{
2678 BytesDeserializer
::new(self)
2682 impl<'de
, E
> IdentifierDeserializer
<'de
, E
> for Borrowed
<'de
, [u8]>
2686 type Deserializer
= BorrowedBytesDeserializer
<'de
, E
>;
2688 fn from(self) -> Self::Deserializer
{
2689 BorrowedBytesDeserializer
::new(self.0)
2693 #[cfg(any(feature = "std", feature = "alloc"))]
2694 pub struct FlatMapDeserializer
<'a
, 'de
: 'a
, E
>(
2695 pub &'a
mut Vec
<Option
<(Content
<'de
>, Content
<'de
>)>>,
2699 #[cfg(any(feature = "std", feature = "alloc"))]
2700 impl<'a
, 'de
, E
> FlatMapDeserializer
<'a
, 'de
, E
>
2704 fn deserialize_other
<V
>() -> Result
<V
, E
> {
2705 Err(Error
::custom("can only flatten structs and maps"))
2709 #[cfg(any(feature = "std", feature = "alloc"))]
2710 macro_rules
! forward_to_deserialize_other
{
2711 ($
($func
:ident ($
($arg
:ty
),*))*) => {
2713 fn $func
<V
>(self, $
(_
: $arg
,)* _visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2717 Self::deserialize_other()
2723 #[cfg(any(feature = "std", feature = "alloc"))]
2724 impl<'a
, 'de
, E
> Deserializer
<'de
> for FlatMapDeserializer
<'a
, 'de
, E
>
2730 fn deserialize_any
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2734 visitor
.visit_map(FlatInternallyTaggedAccess
{
2735 iter
: self.0.iter_mut
(),
2737 _marker
: PhantomData
,
2741 fn deserialize_enum
<V
>(
2744 variants
: &'
static [&'
static str],
2746 ) -> Result
<V
::Value
, Self::Error
>
2750 for item
in self.0.iter_mut
() {
2751 // items in the vector are nulled out when used. So we can only use
2752 // an item if it's still filled in and if the field is one we care
2754 let use_item
= match *item
{
2756 Some((ref c
, _
)) => c
.as_str().map_or(false, |x
| variants
.contains(&x
)),
2760 let (key
, value
) = item
.take().unwrap();
2761 return visitor
.visit_enum(EnumDeserializer
::new(key
, Some(value
)));
2765 Err(Error
::custom(format_args
!(
2766 "no variant of enum {} found in flattened data",
2771 fn deserialize_map
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2775 visitor
.visit_map(FlatMapAccess
::new(self.0.iter
()))
2778 fn deserialize_struct
<V
>(
2781 fields
: &'
static [&'
static str],
2783 ) -> Result
<V
::Value
, Self::Error
>
2787 visitor
.visit_map(FlatStructAccess
::new(self.0.iter_mut
(), fields
))
2790 fn deserialize_newtype_struct
<V
>(self, _name
: &str, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2794 visitor
.visit_newtype_struct(self)
2797 fn deserialize_option
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2801 match visitor
.__private_visit_untagged_option(self) {
2802 Ok(value
) => Ok(value
),
2803 Err(()) => Self::deserialize_other(),
2807 fn deserialize_unit
<V
>(self, visitor
: V
) -> Result
<V
::Value
, Self::Error
>
2811 visitor
.visit_unit()
2814 forward_to_deserialize_other
! {
2828 deserialize_string()
2830 deserialize_byte_buf()
2831 deserialize_unit_struct(&'
static str)
2833 deserialize_tuple(usize)
2834 deserialize_tuple_struct(&'
static str, usize)
2835 deserialize_identifier()
2836 deserialize_ignored_any()
2840 #[cfg(any(feature = "std", feature = "alloc"))]
2841 pub struct FlatMapAccess
<'a
, 'de
: 'a
, E
> {
2842 iter
: slice
::Iter
<'a
, Option
<(Content
<'de
>, Content
<'de
>)>>,
2843 pending_content
: Option
<&'a Content
<'de
>>,
2844 _marker
: PhantomData
<E
>,
2847 #[cfg(any(feature = "std", feature = "alloc"))]
2848 impl<'a
, 'de
, E
> FlatMapAccess
<'a
, 'de
, E
> {
2850 iter
: slice
::Iter
<'a
, Option
<(Content
<'de
>, Content
<'de
>)>>,
2851 ) -> FlatMapAccess
<'a
, 'de
, E
> {
2854 pending_content
: None
,
2855 _marker
: PhantomData
,
2860 #[cfg(any(feature = "std", feature = "alloc"))]
2861 impl<'a
, 'de
, E
> MapAccess
<'de
> for FlatMapAccess
<'a
, 'de
, E
>
2867 fn next_key_seed
<T
>(&mut self, seed
: T
) -> Result
<Option
<T
::Value
>, Self::Error
>
2869 T
: DeserializeSeed
<'de
>,
2871 for item
in &mut self.iter
{
2872 // Items in the vector are nulled out when used by a struct.
2873 if let Some((ref key
, ref content
)) = *item
{
2874 self.pending_content
= Some(content
);
2875 return seed
.deserialize(ContentRefDeserializer
::new(key
)).map(Some
);
2881 fn next_value_seed
<T
>(&mut self, seed
: T
) -> Result
<T
::Value
, Self::Error
>
2883 T
: DeserializeSeed
<'de
>,
2885 match self.pending_content
.take() {
2886 Some(value
) => seed
.deserialize(ContentRefDeserializer
::new(value
)),
2887 None
=> Err(Error
::custom("value is missing")),
2892 #[cfg(any(feature = "std", feature = "alloc"))]
2893 pub struct FlatStructAccess
<'a
, 'de
: 'a
, E
> {
2894 iter
: slice
::IterMut
<'a
, Option
<(Content
<'de
>, Content
<'de
>)>>,
2895 pending_content
: Option
<Content
<'de
>>,
2896 fields
: &'
static [&'
static str],
2897 _marker
: PhantomData
<E
>,
2900 #[cfg(any(feature = "std", feature = "alloc"))]
2901 impl<'a
, 'de
, E
> FlatStructAccess
<'a
, 'de
, E
> {
2903 iter
: slice
::IterMut
<'a
, Option
<(Content
<'de
>, Content
<'de
>)>>,
2904 fields
: &'
static [&'
static str],
2905 ) -> FlatStructAccess
<'a
, 'de
, E
> {
2908 pending_content
: None
,
2910 _marker
: PhantomData
,
2915 #[cfg(any(feature = "std", feature = "alloc"))]
2916 impl<'a
, 'de
, E
> MapAccess
<'de
> for FlatStructAccess
<'a
, 'de
, E
>
2922 fn next_key_seed
<T
>(&mut self, seed
: T
) -> Result
<Option
<T
::Value
>, Self::Error
>
2924 T
: DeserializeSeed
<'de
>,
2926 while let Some(item
) = self.iter
.next() {
2927 // items in the vector are nulled out when used. So we can only use
2928 // an item if it's still filled in and if the field is one we care
2929 // about. In case we do not know which fields we want, we take them all.
2930 let use_item
= match *item
{
2932 Some((ref c
, _
)) => c
.as_str().map_or(false, |key
| self.fields
.contains(&key
)),
2936 let (key
, content
) = item
.take().unwrap();
2937 self.pending_content
= Some(content
);
2938 return seed
.deserialize(ContentDeserializer
::new(key
)).map(Some
);
2944 fn next_value_seed
<T
>(&mut self, seed
: T
) -> Result
<T
::Value
, Self::Error
>
2946 T
: DeserializeSeed
<'de
>,
2948 match self.pending_content
.take() {
2949 Some(value
) => seed
.deserialize(ContentDeserializer
::new(value
)),
2950 None
=> Err(Error
::custom("value is missing")),
2955 #[cfg(any(feature = "std", feature = "alloc"))]
2956 pub struct FlatInternallyTaggedAccess
<'a
, 'de
: 'a
, E
> {
2957 iter
: slice
::IterMut
<'a
, Option
<(Content
<'de
>, Content
<'de
>)>>,
2958 pending
: Option
<&'a Content
<'de
>>,
2959 _marker
: PhantomData
<E
>,
2962 #[cfg(any(feature = "std", feature = "alloc"))]
2963 impl<'a
, 'de
, E
> MapAccess
<'de
> for FlatInternallyTaggedAccess
<'a
, 'de
, E
>
2969 fn next_key_seed
<T
>(&mut self, seed
: T
) -> Result
<Option
<T
::Value
>, Self::Error
>
2971 T
: DeserializeSeed
<'de
>,
2973 for item
in &mut self.iter
{
2974 if let Some((ref key
, ref content
)) = *item
{
2975 // Do not take(), instead borrow this entry. The internally tagged
2976 // enum does its own buffering so we can't tell whether this entry
2977 // is going to be consumed. Borrowing here leaves the entry
2978 // available for later flattened fields.
2979 self.pending
= Some(content
);
2980 return seed
.deserialize(ContentRefDeserializer
::new(key
)).map(Some
);
2986 fn next_value_seed
<T
>(&mut self, seed
: T
) -> Result
<T
::Value
, Self::Error
>
2988 T
: DeserializeSeed
<'de
>,
2990 match self.pending
.take() {
2991 Some(value
) => seed
.deserialize(ContentRefDeserializer
::new(value
)),
2992 None
=> panic
!("value is missing"),