Coverage Report

Created: 2025-08-26 06:52

/rust/registry/src/index.crates.io-6f17d22bba15001f/serde-1.0.219/src/de/value.rs
Line
Count
Source (jump to first uncovered line)
1
//! Building blocks for deserializing basic values using the `IntoDeserializer`
2
//! trait.
3
//!
4
//! ```edition2021
5
//! use serde::de::{value, Deserialize, IntoDeserializer};
6
//! use serde_derive::Deserialize;
7
//! use std::str::FromStr;
8
//!
9
//! #[derive(Deserialize)]
10
//! enum Setting {
11
//!     On,
12
//!     Off,
13
//! }
14
//!
15
//! impl FromStr for Setting {
16
//!     type Err = value::Error;
17
//!
18
//!     fn from_str(s: &str) -> Result<Self, Self::Err> {
19
//!         Self::deserialize(s.into_deserializer())
20
//!     }
21
//! }
22
//! ```
23
24
use crate::lib::*;
25
26
use self::private::{First, Second};
27
use crate::de::{self, size_hint, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor};
28
use crate::ser;
29
30
////////////////////////////////////////////////////////////////////////////////
31
32
// For structs that contain a PhantomData. We do not want the trait
33
// bound `E: Clone` inferred by derive(Clone).
34
macro_rules! impl_copy_clone {
35
    ($ty:ident $(<$lifetime:tt>)*) => {
36
        impl<$($lifetime,)* E> Copy for $ty<$($lifetime,)* E> {}
37
38
        impl<$($lifetime,)* E> Clone for $ty<$($lifetime,)* E> {
39
0
            fn clone(&self) -> Self {
40
0
                *self
41
0
            }
Unexecuted instantiation: <serde::de::value::UnitDeserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::BoolDeserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::I8Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::I16Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::I32Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::I64Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::I128Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::IsizeDeserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::U8Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::U16Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::U64Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::U128Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::UsizeDeserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::F32Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::F64Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::CharDeserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::U32Deserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::StrDeserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::BorrowedStrDeserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::BytesDeserializer<_> as core::clone::Clone>::clone
Unexecuted instantiation: <serde::de::value::BorrowedBytesDeserializer<_> as core::clone::Clone>::clone
42
        }
43
    };
44
}
45
46
////////////////////////////////////////////////////////////////////////////////
47
48
/// A minimal representation of all possible errors that can occur using the
49
/// `IntoDeserializer` trait.
50
#[derive(Clone, PartialEq)]
51
pub struct Error {
52
    err: ErrorImpl,
53
}
54
55
#[cfg(any(feature = "std", feature = "alloc"))]
56
type ErrorImpl = Box<str>;
57
#[cfg(not(any(feature = "std", feature = "alloc")))]
58
type ErrorImpl = ();
59
60
impl de::Error for Error {
61
    #[cfg(any(feature = "std", feature = "alloc"))]
62
    #[cold]
63
0
    fn custom<T>(msg: T) -> Self
64
0
    where
65
0
        T: Display,
66
0
    {
67
0
        Error {
68
0
            err: msg.to_string().into_boxed_str(),
69
0
        }
70
0
    }
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
83
impl ser::Error for Error {
84
    #[cold]
85
0
    fn custom<T>(msg: T) -> Self
86
0
    where
87
0
        T: Display,
88
0
    {
89
0
        de::Error::custom(msg)
90
0
    }
91
}
92
93
impl Display for Error {
94
    #[cfg(any(feature = "std", feature = "alloc"))]
95
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
96
0
        formatter.write_str(&self.err)
97
0
    }
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
105
impl Debug for Error {
106
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
107
0
        let mut debug = formatter.debug_tuple("Error");
108
0
        #[cfg(any(feature = "std", feature = "alloc"))]
109
0
        debug.field(&self.err);
110
0
        debug.finish()
111
0
    }
112
}
113
114
#[cfg(feature = "std")]
115
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
116
impl error::Error for Error {
117
0
    fn description(&self) -> &str {
118
0
        &self.err
119
0
    }
120
}
121
122
////////////////////////////////////////////////////////////////////////////////
123
124
impl<'de, E> IntoDeserializer<'de, E> for ()
125
where
126
    E: de::Error,
127
{
128
    type Deserializer = UnitDeserializer<E>;
129
130
0
    fn into_deserializer(self) -> UnitDeserializer<E> {
131
0
        UnitDeserializer::new()
132
0
    }
133
}
134
135
/// A deserializer holding a `()`.
136
pub struct UnitDeserializer<E> {
137
    marker: PhantomData<E>,
138
}
139
140
impl_copy_clone!(UnitDeserializer);
141
142
impl<E> UnitDeserializer<E> {
143
    #[allow(missing_docs)]
144
0
    pub fn new() -> Self {
145
0
        UnitDeserializer {
146
0
            marker: PhantomData,
147
0
        }
148
0
    }
149
}
150
151
impl<'de, E> de::Deserializer<'de> for UnitDeserializer<E>
152
where
153
    E: de::Error,
154
{
155
    type Error = E;
156
157
    forward_to_deserialize_any! {
158
        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
159
        bytes byte_buf unit unit_struct newtype_struct seq tuple tuple_struct
160
        map struct enum identifier ignored_any
161
    }
162
163
0
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
164
0
    where
165
0
        V: de::Visitor<'de>,
166
0
    {
167
0
        visitor.visit_unit()
168
0
    }
169
170
0
    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
171
0
    where
172
0
        V: de::Visitor<'de>,
173
0
    {
174
0
        visitor.visit_none()
175
0
    }
176
}
177
178
impl<'de, E> IntoDeserializer<'de, E> for UnitDeserializer<E>
179
where
180
    E: de::Error,
181
{
182
    type Deserializer = Self;
183
184
0
    fn into_deserializer(self) -> Self {
185
0
        self
186
0
    }
187
}
188
189
impl<E> Debug for UnitDeserializer<E> {
190
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
191
0
        formatter.debug_struct("UnitDeserializer").finish()
192
0
    }
193
}
194
195
////////////////////////////////////////////////////////////////////////////////
196
197
/// A deserializer that cannot be instantiated.
198
#[cfg(feature = "unstable")]
199
#[cfg_attr(docsrs, doc(cfg(feature = "unstable")))]
200
pub struct NeverDeserializer<E> {
201
    never: !,
202
    marker: PhantomData<E>,
203
}
204
205
#[cfg(feature = "unstable")]
206
#[cfg_attr(docsrs, doc(cfg(feature = "unstable")))]
207
impl<'de, E> IntoDeserializer<'de, E> for !
208
where
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")]
219
impl<'de, E> de::Deserializer<'de> for NeverDeserializer<E>
220
where
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")]
240
impl<'de, E> IntoDeserializer<'de, E> for NeverDeserializer<E>
241
where
242
    E: de::Error,
243
{
244
    type Deserializer = Self;
245
246
    fn into_deserializer(self) -> Self {
247
        self
248
    }
249
}
250
251
////////////////////////////////////////////////////////////////////////////////
252
253
macro_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
0
            fn into_deserializer(self) -> $name<E> {
271
0
                $name::new(self)
272
0
            }
Unexecuted instantiation: <bool as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <i8 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <i16 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <i32 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <i64 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <i128 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <isize as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <u8 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <u16 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <u64 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <u128 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <usize as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <f32 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <f64 as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <char as serde::de::IntoDeserializer<_>>::into_deserializer
273
        }
274
275
        impl<E> $name<E> {
276
            #[allow(missing_docs)]
277
0
            pub fn new(value: $ty) -> Self {
278
0
                $name {
279
0
                    value,
280
0
                    marker: PhantomData,
281
0
                }
282
0
            }
Unexecuted instantiation: <serde::de::value::BoolDeserializer<_>>::new
Unexecuted instantiation: <serde::de::value::I8Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::I16Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::I32Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::I64Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::I128Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::IsizeDeserializer<_>>::new
Unexecuted instantiation: <serde::de::value::U8Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::U16Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::U64Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::U128Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::UsizeDeserializer<_>>::new
Unexecuted instantiation: <serde::de::value::F32Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::F64Deserializer<_>>::new
Unexecuted instantiation: <serde::de::value::CharDeserializer<_>>::new
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
0
            fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
298
0
            where
299
0
                V: de::Visitor<'de>,
300
0
            {
301
0
                visitor.$method(self.value $($cast)*)
302
0
            }
Unexecuted instantiation: <serde::de::value::BoolDeserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::I8Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::I16Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::I32Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::I64Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::I128Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::IsizeDeserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::U8Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::U16Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::U64Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::U128Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::UsizeDeserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::F32Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::F64Deserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
Unexecuted instantiation: <serde::de::value::CharDeserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
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
0
            fn into_deserializer(self) -> Self {
312
0
                self
313
0
            }
Unexecuted instantiation: <serde::de::value::BoolDeserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::I8Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::I16Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::I32Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::I64Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::I128Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::IsizeDeserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::U8Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::U16Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::U64Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::U128Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::UsizeDeserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::F32Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::F64Deserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
Unexecuted instantiation: <serde::de::value::CharDeserializer<_> as serde::de::IntoDeserializer<_>>::into_deserializer
314
        }
315
316
        impl<E> Debug for $name<E> {
317
0
            fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
318
0
                formatter
319
0
                    .debug_struct(stringify!($name))
320
0
                    .field("value", &self.value)
321
0
                    .finish()
322
0
            }
Unexecuted instantiation: <serde::de::value::BoolDeserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::I8Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::I16Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::I32Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::I64Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::I128Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::IsizeDeserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::U8Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::U16Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::U64Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::U128Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::UsizeDeserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::F32Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::F64Deserializer<_> as core::fmt::Debug>::fmt
Unexecuted instantiation: <serde::de::value::CharDeserializer<_> as core::fmt::Debug>::fmt
323
        }
324
    }
325
}
326
327
primitive_deserializer!(bool, "a `bool`.", BoolDeserializer, visit_bool);
328
primitive_deserializer!(i8, "an `i8`.", I8Deserializer, visit_i8);
329
primitive_deserializer!(i16, "an `i16`.", I16Deserializer, visit_i16);
330
primitive_deserializer!(i32, "an `i32`.", I32Deserializer, visit_i32);
331
primitive_deserializer!(i64, "an `i64`.", I64Deserializer, visit_i64);
332
primitive_deserializer!(i128, "an `i128`.", I128Deserializer, visit_i128);
333
primitive_deserializer!(isize, "an `isize`.", IsizeDeserializer, visit_i64 as i64);
334
primitive_deserializer!(u8, "a `u8`.", U8Deserializer, visit_u8);
335
primitive_deserializer!(u16, "a `u16`.", U16Deserializer, visit_u16);
336
primitive_deserializer!(u64, "a `u64`.", U64Deserializer, visit_u64);
337
primitive_deserializer!(u128, "a `u128`.", U128Deserializer, visit_u128);
338
primitive_deserializer!(usize, "a `usize`.", UsizeDeserializer, visit_u64 as u64);
339
primitive_deserializer!(f32, "an `f32`.", F32Deserializer, visit_f32);
340
primitive_deserializer!(f64, "an `f64`.", F64Deserializer, visit_f64);
341
primitive_deserializer!(char, "a `char`.", CharDeserializer, visit_char);
342
343
/// A deserializer holding a `u32`.
344
pub struct U32Deserializer<E> {
345
    value: u32,
346
    marker: PhantomData<E>,
347
}
348
349
impl_copy_clone!(U32Deserializer);
350
351
impl<'de, E> IntoDeserializer<'de, E> for u32
352
where
353
    E: de::Error,
354
{
355
    type Deserializer = U32Deserializer<E>;
356
357
0
    fn into_deserializer(self) -> U32Deserializer<E> {
358
0
        U32Deserializer::new(self)
359
0
    }
360
}
361
362
impl<E> U32Deserializer<E> {
363
    #[allow(missing_docs)]
364
0
    pub fn new(value: u32) -> Self {
365
0
        U32Deserializer {
366
0
            value,
367
0
            marker: PhantomData,
368
0
        }
369
0
    }
370
}
371
372
impl<'de, E> de::Deserializer<'de> for U32Deserializer<E>
373
where
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
0
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
385
0
    where
386
0
        V: de::Visitor<'de>,
387
0
    {
388
0
        visitor.visit_u32(self.value)
389
0
    }
390
391
0
    fn deserialize_enum<V>(
392
0
        self,
393
0
        name: &str,
394
0
        variants: &'static [&'static str],
395
0
        visitor: V,
396
0
    ) -> Result<V::Value, Self::Error>
397
0
    where
398
0
        V: de::Visitor<'de>,
399
0
    {
400
0
        let _ = name;
401
0
        let _ = variants;
402
0
        visitor.visit_enum(self)
403
0
    }
404
}
405
406
impl<'de, E> IntoDeserializer<'de, E> for U32Deserializer<E>
407
where
408
    E: de::Error,
409
{
410
    type Deserializer = Self;
411
412
0
    fn into_deserializer(self) -> Self {
413
0
        self
414
0
    }
415
}
416
417
impl<'de, E> de::EnumAccess<'de> for U32Deserializer<E>
418
where
419
    E: de::Error,
420
{
421
    type Error = E;
422
    type Variant = private::UnitOnly<E>;
423
424
0
    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
425
0
    where
426
0
        T: de::DeserializeSeed<'de>,
427
0
    {
428
0
        seed.deserialize(self).map(private::unit_only)
429
0
    }
430
}
431
432
impl<E> Debug for U32Deserializer<E> {
433
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
434
0
        formatter
435
0
            .debug_struct("U32Deserializer")
436
0
            .field("value", &self.value)
437
0
            .finish()
438
0
    }
439
}
440
441
////////////////////////////////////////////////////////////////////////////////
442
443
/// A deserializer holding a `&str`.
444
pub struct StrDeserializer<'a, E> {
445
    value: &'a str,
446
    marker: PhantomData<E>,
447
}
448
449
impl_copy_clone!(StrDeserializer<'de>);
450
451
impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a str
452
where
453
    E: de::Error,
454
{
455
    type Deserializer = StrDeserializer<'a, E>;
456
457
0
    fn into_deserializer(self) -> StrDeserializer<'a, E> {
458
0
        StrDeserializer::new(self)
459
0
    }
460
}
461
462
impl<'a, E> StrDeserializer<'a, E> {
463
    #[allow(missing_docs)]
464
294k
    pub fn new(value: &'a str) -> Self {
465
294k
        StrDeserializer {
466
294k
            value,
467
294k
            marker: PhantomData,
468
294k
        }
469
294k
    }
<serde::de::value::StrDeserializer<serde_yaml::error::Error>>::new
Line
Count
Source
464
294k
    pub fn new(value: &'a str) -> Self {
465
294k
        StrDeserializer {
466
294k
            value,
467
294k
            marker: PhantomData,
468
294k
        }
469
294k
    }
Unexecuted instantiation: <serde::de::value::StrDeserializer<_>>::new
470
}
471
472
impl<'de, 'a, E> de::Deserializer<'de> for StrDeserializer<'a, E>
473
where
474
    E: de::Error,
475
{
476
    type Error = E;
477
478
294k
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
479
294k
    where
480
294k
        V: de::Visitor<'de>,
481
294k
    {
482
294k
        visitor.visit_str(self.value)
483
294k
    }
<serde::de::value::StrDeserializer<serde_yaml::error::Error> as serde::de::Deserializer>::deserialize_any::<serde_yaml::value::tagged::TagStringVisitor>
Line
Count
Source
478
294k
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
479
294k
    where
480
294k
        V: de::Visitor<'de>,
481
294k
    {
482
294k
        visitor.visit_str(self.value)
483
294k
    }
Unexecuted instantiation: <serde::de::value::StrDeserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
484
485
0
    fn deserialize_enum<V>(
486
0
        self,
487
0
        name: &str,
488
0
        variants: &'static [&'static str],
489
0
        visitor: V,
490
0
    ) -> Result<V::Value, Self::Error>
491
0
    where
492
0
        V: de::Visitor<'de>,
493
0
    {
494
0
        let _ = name;
495
0
        let _ = variants;
496
0
        visitor.visit_enum(self)
497
0
    }
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
506
impl<'de, 'a, E> IntoDeserializer<'de, E> for StrDeserializer<'a, E>
507
where
508
    E: de::Error,
509
{
510
    type Deserializer = Self;
511
512
0
    fn into_deserializer(self) -> Self {
513
0
        self
514
0
    }
515
}
516
517
impl<'de, 'a, E> de::EnumAccess<'de> for StrDeserializer<'a, E>
518
where
519
    E: de::Error,
520
{
521
    type Error = E;
522
    type Variant = private::UnitOnly<E>;
523
524
0
    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
525
0
    where
526
0
        T: de::DeserializeSeed<'de>,
527
0
    {
528
0
        seed.deserialize(self).map(private::unit_only)
529
0
    }
530
}
531
532
impl<'a, E> Debug for StrDeserializer<'a, E> {
533
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
534
0
        formatter
535
0
            .debug_struct("StrDeserializer")
536
0
            .field("value", &self.value)
537
0
            .finish()
538
0
    }
539
}
540
541
////////////////////////////////////////////////////////////////////////////////
542
543
/// A deserializer holding a `&str` with a lifetime tied to another
544
/// deserializer.
545
pub struct BorrowedStrDeserializer<'de, E> {
546
    value: &'de str,
547
    marker: PhantomData<E>,
548
}
549
550
impl_copy_clone!(BorrowedStrDeserializer<'de>);
551
552
impl<'de, E> BorrowedStrDeserializer<'de, E> {
553
    /// Create a new borrowed deserializer from the given string.
554
0
    pub fn new(value: &'de str) -> BorrowedStrDeserializer<'de, E> {
555
0
        BorrowedStrDeserializer {
556
0
            value,
557
0
            marker: PhantomData,
558
0
        }
559
0
    }
560
}
561
562
impl<'de, E> de::Deserializer<'de> for BorrowedStrDeserializer<'de, E>
563
where
564
    E: de::Error,
565
{
566
    type Error = E;
567
568
0
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
569
0
    where
570
0
        V: de::Visitor<'de>,
571
0
    {
572
0
        visitor.visit_borrowed_str(self.value)
573
0
    }
574
575
0
    fn deserialize_enum<V>(
576
0
        self,
577
0
        name: &str,
578
0
        variants: &'static [&'static str],
579
0
        visitor: V,
580
0
    ) -> Result<V::Value, Self::Error>
581
0
    where
582
0
        V: de::Visitor<'de>,
583
0
    {
584
0
        let _ = name;
585
0
        let _ = variants;
586
0
        visitor.visit_enum(self)
587
0
    }
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
596
impl<'de, E> IntoDeserializer<'de, E> for BorrowedStrDeserializer<'de, E>
597
where
598
    E: de::Error,
599
{
600
    type Deserializer = Self;
601
602
0
    fn into_deserializer(self) -> Self {
603
0
        self
604
0
    }
605
}
606
607
impl<'de, E> de::EnumAccess<'de> for BorrowedStrDeserializer<'de, E>
608
where
609
    E: de::Error,
610
{
611
    type Error = E;
612
    type Variant = private::UnitOnly<E>;
613
614
0
    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
615
0
    where
616
0
        T: de::DeserializeSeed<'de>,
617
0
    {
618
0
        seed.deserialize(self).map(private::unit_only)
619
0
    }
620
}
621
622
impl<'de, E> Debug for BorrowedStrDeserializer<'de, E> {
623
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
624
0
        formatter
625
0
            .debug_struct("BorrowedStrDeserializer")
626
0
            .field("value", &self.value)
627
0
            .finish()
628
0
    }
629
}
630
631
////////////////////////////////////////////////////////////////////////////////
632
633
/// A deserializer holding a `String`.
634
#[cfg(any(feature = "std", feature = "alloc"))]
635
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
636
pub struct StringDeserializer<E> {
637
    value: String,
638
    marker: PhantomData<E>,
639
}
640
641
#[cfg(any(feature = "std", feature = "alloc"))]
642
impl<E> Clone for StringDeserializer<E> {
643
0
    fn clone(&self) -> Self {
644
0
        StringDeserializer {
645
0
            value: self.value.clone(),
646
0
            marker: PhantomData,
647
0
        }
648
0
    }
649
}
650
651
#[cfg(any(feature = "std", feature = "alloc"))]
652
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
653
impl<'de, E> IntoDeserializer<'de, E> for String
654
where
655
    E: de::Error,
656
{
657
    type Deserializer = StringDeserializer<E>;
658
659
0
    fn into_deserializer(self) -> StringDeserializer<E> {
660
0
        StringDeserializer::new(self)
661
0
    }
662
}
663
664
#[cfg(any(feature = "std", feature = "alloc"))]
665
impl<E> StringDeserializer<E> {
666
    #[allow(missing_docs)]
667
0
    pub fn new(value: String) -> Self {
668
0
        StringDeserializer {
669
0
            value,
670
0
            marker: PhantomData,
671
0
        }
672
0
    }
673
}
674
675
#[cfg(any(feature = "std", feature = "alloc"))]
676
impl<'de, E> de::Deserializer<'de> for StringDeserializer<E>
677
where
678
    E: de::Error,
679
{
680
    type Error = E;
681
682
0
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
683
0
    where
684
0
        V: de::Visitor<'de>,
685
0
    {
686
0
        visitor.visit_string(self.value)
687
0
    }
688
689
0
    fn deserialize_enum<V>(
690
0
        self,
691
0
        name: &str,
692
0
        variants: &'static [&'static str],
693
0
        visitor: V,
694
0
    ) -> Result<V::Value, Self::Error>
695
0
    where
696
0
        V: de::Visitor<'de>,
697
0
    {
698
0
        let _ = name;
699
0
        let _ = variants;
700
0
        visitor.visit_enum(self)
701
0
    }
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"))]
711
impl<'de, E> IntoDeserializer<'de, E> for StringDeserializer<E>
712
where
713
    E: de::Error,
714
{
715
    type Deserializer = Self;
716
717
0
    fn into_deserializer(self) -> Self {
718
0
        self
719
0
    }
720
}
721
722
#[cfg(any(feature = "std", feature = "alloc"))]
723
impl<'de, E> de::EnumAccess<'de> for StringDeserializer<E>
724
where
725
    E: de::Error,
726
{
727
    type Error = E;
728
    type Variant = private::UnitOnly<E>;
729
730
0
    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
731
0
    where
732
0
        T: de::DeserializeSeed<'de>,
733
0
    {
734
0
        seed.deserialize(self).map(private::unit_only)
735
0
    }
736
}
737
738
#[cfg(any(feature = "std", feature = "alloc"))]
739
impl<E> Debug for StringDeserializer<E> {
740
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
741
0
        formatter
742
0
            .debug_struct("StringDeserializer")
743
0
            .field("value", &self.value)
744
0
            .finish()
745
0
    }
746
}
747
748
////////////////////////////////////////////////////////////////////////////////
749
750
/// A deserializer holding a `Cow<str>`.
751
#[cfg(any(feature = "std", feature = "alloc"))]
752
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
753
pub struct CowStrDeserializer<'a, E> {
754
    value: Cow<'a, str>,
755
    marker: PhantomData<E>,
756
}
757
758
#[cfg(any(feature = "std", feature = "alloc"))]
759
impl<'a, E> Clone for CowStrDeserializer<'a, E> {
760
0
    fn clone(&self) -> Self {
761
0
        CowStrDeserializer {
762
0
            value: self.value.clone(),
763
0
            marker: PhantomData,
764
0
        }
765
0
    }
766
}
767
768
#[cfg(any(feature = "std", feature = "alloc"))]
769
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
770
impl<'de, 'a, E> IntoDeserializer<'de, E> for Cow<'a, str>
771
where
772
    E: de::Error,
773
{
774
    type Deserializer = CowStrDeserializer<'a, E>;
775
776
0
    fn into_deserializer(self) -> CowStrDeserializer<'a, E> {
777
0
        CowStrDeserializer::new(self)
778
0
    }
779
}
780
781
#[cfg(any(feature = "std", feature = "alloc"))]
782
impl<'a, E> CowStrDeserializer<'a, E> {
783
    #[allow(missing_docs)]
784
0
    pub fn new(value: Cow<'a, str>) -> Self {
785
0
        CowStrDeserializer {
786
0
            value,
787
0
            marker: PhantomData,
788
0
        }
789
0
    }
790
}
791
792
#[cfg(any(feature = "std", feature = "alloc"))]
793
impl<'de, 'a, E> de::Deserializer<'de> for CowStrDeserializer<'a, E>
794
where
795
    E: de::Error,
796
{
797
    type Error = E;
798
799
0
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
800
0
    where
801
0
        V: de::Visitor<'de>,
802
0
    {
803
0
        match self.value {
804
0
            Cow::Borrowed(string) => visitor.visit_str(string),
805
0
            Cow::Owned(string) => visitor.visit_string(string),
806
        }
807
0
    }
808
809
0
    fn deserialize_enum<V>(
810
0
        self,
811
0
        name: &str,
812
0
        variants: &'static [&'static str],
813
0
        visitor: V,
814
0
    ) -> Result<V::Value, Self::Error>
815
0
    where
816
0
        V: de::Visitor<'de>,
817
0
    {
818
0
        let _ = name;
819
0
        let _ = variants;
820
0
        visitor.visit_enum(self)
821
0
    }
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"))]
831
impl<'de, 'a, E> IntoDeserializer<'de, E> for CowStrDeserializer<'a, E>
832
where
833
    E: de::Error,
834
{
835
    type Deserializer = Self;
836
837
0
    fn into_deserializer(self) -> Self {
838
0
        self
839
0
    }
840
}
841
842
#[cfg(any(feature = "std", feature = "alloc"))]
843
impl<'de, 'a, E> de::EnumAccess<'de> for CowStrDeserializer<'a, E>
844
where
845
    E: de::Error,
846
{
847
    type Error = E;
848
    type Variant = private::UnitOnly<E>;
849
850
0
    fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
851
0
    where
852
0
        T: de::DeserializeSeed<'de>,
853
0
    {
854
0
        seed.deserialize(self).map(private::unit_only)
855
0
    }
856
}
857
858
#[cfg(any(feature = "std", feature = "alloc"))]
859
impl<'a, E> Debug for CowStrDeserializer<'a, E> {
860
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
861
0
        formatter
862
0
            .debug_struct("CowStrDeserializer")
863
0
            .field("value", &self.value)
864
0
            .finish()
865
0
    }
866
}
867
868
////////////////////////////////////////////////////////////////////////////////
869
870
/// A deserializer holding a `&[u8]`. Always calls [`Visitor::visit_bytes`].
871
pub struct BytesDeserializer<'a, E> {
872
    value: &'a [u8],
873
    marker: PhantomData<E>,
874
}
875
876
impl<'a, E> BytesDeserializer<'a, E> {
877
    /// Create a new deserializer from the given bytes.
878
0
    pub fn new(value: &'a [u8]) -> Self {
879
0
        BytesDeserializer {
880
0
            value,
881
0
            marker: PhantomData,
882
0
        }
883
0
    }
884
}
885
886
impl_copy_clone!(BytesDeserializer<'a>);
887
888
impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a [u8]
889
where
890
    E: de::Error,
891
{
892
    type Deserializer = BytesDeserializer<'a, E>;
893
894
0
    fn into_deserializer(self) -> BytesDeserializer<'a, E> {
895
0
        BytesDeserializer::new(self)
896
0
    }
897
}
898
899
impl<'de, 'a, E> Deserializer<'de> for BytesDeserializer<'a, E>
900
where
901
    E: de::Error,
902
{
903
    type Error = E;
904
905
0
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
906
0
    where
907
0
        V: Visitor<'de>,
908
0
    {
909
0
        visitor.visit_bytes(self.value)
910
0
    }
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
919
impl<'de, 'a, E> IntoDeserializer<'de, E> for BytesDeserializer<'a, E>
920
where
921
    E: de::Error,
922
{
923
    type Deserializer = Self;
924
925
0
    fn into_deserializer(self) -> Self {
926
0
        self
927
0
    }
928
}
929
930
impl<'a, E> Debug for BytesDeserializer<'a, E> {
931
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
932
0
        formatter
933
0
            .debug_struct("BytesDeserializer")
934
0
            .field("value", &self.value)
935
0
            .finish()
936
0
    }
937
}
938
939
/// A deserializer holding a `&[u8]` with a lifetime tied to another
940
/// deserializer. Always calls [`Visitor::visit_borrowed_bytes`].
941
pub struct BorrowedBytesDeserializer<'de, E> {
942
    value: &'de [u8],
943
    marker: PhantomData<E>,
944
}
945
946
impl<'de, E> BorrowedBytesDeserializer<'de, E> {
947
    /// Create a new borrowed deserializer from the given borrowed bytes.
948
0
    pub fn new(value: &'de [u8]) -> Self {
949
0
        BorrowedBytesDeserializer {
950
0
            value,
951
0
            marker: PhantomData,
952
0
        }
953
0
    }
954
}
955
956
impl_copy_clone!(BorrowedBytesDeserializer<'de>);
957
958
impl<'de, E> Deserializer<'de> for BorrowedBytesDeserializer<'de, E>
959
where
960
    E: de::Error,
961
{
962
    type Error = E;
963
964
0
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
965
0
    where
966
0
        V: Visitor<'de>,
967
0
    {
968
0
        visitor.visit_borrowed_bytes(self.value)
969
0
    }
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
978
impl<'de, E> IntoDeserializer<'de, E> for BorrowedBytesDeserializer<'de, E>
979
where
980
    E: de::Error,
981
{
982
    type Deserializer = Self;
983
984
0
    fn into_deserializer(self) -> Self {
985
0
        self
986
0
    }
987
}
988
989
impl<'de, E> Debug for BorrowedBytesDeserializer<'de, E> {
990
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
991
0
        formatter
992
0
            .debug_struct("BorrowedBytesDeserializer")
993
0
            .field("value", &self.value)
994
0
            .finish()
995
0
    }
996
}
997
998
////////////////////////////////////////////////////////////////////////////////
999
1000
/// A deserializer that iterates over a sequence.
1001
#[derive(Clone)]
1002
pub struct SeqDeserializer<I, E> {
1003
    iter: iter::Fuse<I>,
1004
    count: usize,
1005
    marker: PhantomData<E>,
1006
}
1007
1008
impl<I, E> SeqDeserializer<I, E>
1009
where
1010
    I: Iterator,
1011
{
1012
    /// Construct a new `SeqDeserializer<I, E>`.
1013
0
    pub fn new(iter: I) -> Self {
1014
0
        SeqDeserializer {
1015
0
            iter: iter.fuse(),
1016
0
            count: 0,
1017
0
            marker: PhantomData,
1018
0
        }
1019
0
    }
1020
}
1021
1022
impl<I, E> SeqDeserializer<I, E>
1023
where
1024
    I: Iterator,
1025
    E: de::Error,
1026
{
1027
    /// Check for remaining elements after passing a `SeqDeserializer` to
1028
    /// `Visitor::visit_seq`.
1029
0
    pub fn end(self) -> Result<(), E> {
1030
0
        let remaining = self.iter.count();
1031
0
        if remaining == 0 {
1032
0
            Ok(())
1033
        } else {
1034
            // First argument is the number of elements in the data, second
1035
            // argument is the number of elements expected by the Deserialize.
1036
0
            Err(de::Error::invalid_length(
1037
0
                self.count + remaining,
1038
0
                &ExpectedInSeq(self.count),
1039
0
            ))
1040
        }
1041
0
    }
1042
}
1043
1044
impl<'de, I, T, E> de::Deserializer<'de> for SeqDeserializer<I, E>
1045
where
1046
    I: Iterator<Item = T>,
1047
    T: IntoDeserializer<'de, E>,
1048
    E: de::Error,
1049
{
1050
    type Error = E;
1051
1052
0
    fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1053
0
    where
1054
0
        V: de::Visitor<'de>,
1055
0
    {
1056
0
        let v = tri!(visitor.visit_seq(&mut self));
1057
0
        tri!(self.end());
1058
0
        Ok(v)
1059
0
    }
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
1068
impl<'de, I, T, E> IntoDeserializer<'de, E> for SeqDeserializer<I, E>
1069
where
1070
    I: Iterator<Item = T>,
1071
    T: IntoDeserializer<'de, E>,
1072
    E: de::Error,
1073
{
1074
    type Deserializer = Self;
1075
1076
0
    fn into_deserializer(self) -> Self {
1077
0
        self
1078
0
    }
1079
}
1080
1081
impl<'de, I, T, E> de::SeqAccess<'de> for SeqDeserializer<I, E>
1082
where
1083
    I: Iterator<Item = T>,
1084
    T: IntoDeserializer<'de, E>,
1085
    E: de::Error,
1086
{
1087
    type Error = E;
1088
1089
0
    fn next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error>
1090
0
    where
1091
0
        V: de::DeserializeSeed<'de>,
1092
0
    {
1093
0
        match self.iter.next() {
1094
0
            Some(value) => {
1095
0
                self.count += 1;
1096
0
                seed.deserialize(value.into_deserializer()).map(Some)
1097
            }
1098
0
            None => Ok(None),
1099
        }
1100
0
    }
1101
1102
0
    fn size_hint(&self) -> Option<usize> {
1103
0
        size_hint::from_bounds(&self.iter)
1104
0
    }
1105
}
1106
1107
struct ExpectedInSeq(usize);
1108
1109
impl Expected for ExpectedInSeq {
1110
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1111
0
        if self.0 == 1 {
1112
0
            formatter.write_str("1 element in sequence")
1113
        } else {
1114
0
            write!(formatter, "{} elements in sequence", self.0)
1115
        }
1116
0
    }
1117
}
1118
1119
impl<I, E> Debug for SeqDeserializer<I, E>
1120
where
1121
    I: Debug,
1122
{
1123
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1124
0
        formatter
1125
0
            .debug_struct("SeqDeserializer")
1126
0
            .field("iter", &self.iter)
1127
0
            .field("count", &self.count)
1128
0
            .finish()
1129
0
    }
1130
}
1131
1132
////////////////////////////////////////////////////////////////////////////////
1133
1134
#[cfg(any(feature = "std", feature = "alloc"))]
1135
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
1136
impl<'de, T, E> IntoDeserializer<'de, E> for Vec<T>
1137
where
1138
    T: IntoDeserializer<'de, E>,
1139
    E: de::Error,
1140
{
1141
    type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;
1142
1143
0
    fn into_deserializer(self) -> Self::Deserializer {
1144
0
        SeqDeserializer::new(self.into_iter())
1145
0
    }
1146
}
1147
1148
#[cfg(any(feature = "std", feature = "alloc"))]
1149
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
1150
impl<'de, T, E> IntoDeserializer<'de, E> for BTreeSet<T>
1151
where
1152
    T: IntoDeserializer<'de, E> + Eq + Ord,
1153
    E: de::Error,
1154
{
1155
    type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;
1156
1157
0
    fn into_deserializer(self) -> Self::Deserializer {
1158
0
        SeqDeserializer::new(self.into_iter())
1159
0
    }
1160
}
1161
1162
#[cfg(feature = "std")]
1163
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
1164
impl<'de, T, S, E> IntoDeserializer<'de, E> for HashSet<T, S>
1165
where
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
0
    fn into_deserializer(self) -> Self::Deserializer {
1173
0
        SeqDeserializer::new(self.into_iter())
1174
0
    }
1175
}
1176
1177
////////////////////////////////////////////////////////////////////////////////
1178
1179
/// A deserializer holding a `SeqAccess`.
1180
#[derive(Clone, Debug)]
1181
pub struct SeqAccessDeserializer<A> {
1182
    seq: A,
1183
}
1184
1185
impl<A> SeqAccessDeserializer<A> {
1186
    /// Construct a new `SeqAccessDeserializer<A>`.
1187
1.06M
    pub fn new(seq: A) -> Self {
1188
1.06M
        SeqAccessDeserializer { seq }
1189
1.06M
    }
<serde::de::value::SeqAccessDeserializer<&mut serde_yaml::de::SeqAccess>>::new
Line
Count
Source
1187
1.06M
    pub fn new(seq: A) -> Self {
1188
1.06M
        SeqAccessDeserializer { seq }
1189
1.06M
    }
Unexecuted instantiation: <serde::de::value::SeqAccessDeserializer<_>>::new
1190
}
1191
1192
impl<'de, A> de::Deserializer<'de> for SeqAccessDeserializer<A>
1193
where
1194
    A: de::SeqAccess<'de>,
1195
{
1196
    type Error = A::Error;
1197
1198
1.06M
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1199
1.06M
    where
1200
1.06M
        V: de::Visitor<'de>,
1201
1.06M
    {
1202
1.06M
        visitor.visit_seq(self.seq)
1203
1.06M
    }
<serde::de::value::SeqAccessDeserializer<&mut serde_yaml::de::SeqAccess> as serde::de::Deserializer>::deserialize_any::<<alloc::vec::Vec<_> as serde::de::Deserialize>::deserialize::VecVisitor<serde_yaml::value::Value>>
Line
Count
Source
1198
1.06M
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1199
1.06M
    where
1200
1.06M
        V: de::Visitor<'de>,
1201
1.06M
    {
1202
1.06M
        visitor.visit_seq(self.seq)
1203
1.06M
    }
Unexecuted instantiation: <serde::de::value::SeqAccessDeserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
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
1212
impl<'de, A> IntoDeserializer<'de, A::Error> for SeqAccessDeserializer<A>
1213
where
1214
    A: de::SeqAccess<'de>,
1215
{
1216
    type Deserializer = Self;
1217
1218
0
    fn into_deserializer(self) -> Self {
1219
0
        self
1220
0
    }
1221
}
1222
1223
////////////////////////////////////////////////////////////////////////////////
1224
1225
/// A deserializer that iterates over a map.
1226
pub struct MapDeserializer<'de, I, E>
1227
where
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
1238
impl<'de, I, E> MapDeserializer<'de, I, E>
1239
where
1240
    I: Iterator,
1241
    I::Item: private::Pair,
1242
{
1243
    /// Construct a new `MapDeserializer<I, E>`.
1244
0
    pub fn new(iter: I) -> Self {
1245
0
        MapDeserializer {
1246
0
            iter: iter.fuse(),
1247
0
            value: None,
1248
0
            count: 0,
1249
0
            lifetime: PhantomData,
1250
0
            error: PhantomData,
1251
0
        }
1252
0
    }
1253
}
1254
1255
impl<'de, I, E> MapDeserializer<'de, I, E>
1256
where
1257
    I: Iterator,
1258
    I::Item: private::Pair,
1259
    E: de::Error,
1260
{
1261
    /// Check for remaining elements after passing a `MapDeserializer` to
1262
    /// `Visitor::visit_map`.
1263
0
    pub fn end(self) -> Result<(), E> {
1264
0
        let remaining = self.iter.count();
1265
0
        if remaining == 0 {
1266
0
            Ok(())
1267
        } else {
1268
            // First argument is the number of elements in the data, second
1269
            // argument is the number of elements expected by the Deserialize.
1270
0
            Err(de::Error::invalid_length(
1271
0
                self.count + remaining,
1272
0
                &ExpectedInMap(self.count),
1273
0
            ))
1274
        }
1275
0
    }
1276
}
1277
1278
impl<'de, I, E> MapDeserializer<'de, I, E>
1279
where
1280
    I: Iterator,
1281
    I::Item: private::Pair,
1282
{
1283
0
    fn next_pair(&mut self) -> Option<(First<I::Item>, Second<I::Item>)> {
1284
0
        match self.iter.next() {
1285
0
            Some(kv) => {
1286
0
                self.count += 1;
1287
0
                Some(private::Pair::split(kv))
1288
            }
1289
0
            None => None,
1290
        }
1291
0
    }
1292
}
1293
1294
impl<'de, I, E> de::Deserializer<'de> for MapDeserializer<'de, I, E>
1295
where
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
0
    fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1305
0
    where
1306
0
        V: de::Visitor<'de>,
1307
0
    {
1308
0
        let value = tri!(visitor.visit_map(&mut self));
1309
0
        tri!(self.end());
1310
0
        Ok(value)
1311
0
    }
1312
1313
0
    fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1314
0
    where
1315
0
        V: de::Visitor<'de>,
1316
0
    {
1317
0
        let value = tri!(visitor.visit_seq(&mut self));
1318
0
        tri!(self.end());
1319
0
        Ok(value)
1320
0
    }
1321
1322
0
    fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1323
0
    where
1324
0
        V: de::Visitor<'de>,
1325
0
    {
1326
0
        let _ = len;
1327
0
        self.deserialize_seq(visitor)
1328
0
    }
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
1337
impl<'de, I, E> IntoDeserializer<'de, E> for MapDeserializer<'de, I, E>
1338
where
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
0
    fn into_deserializer(self) -> Self {
1348
0
        self
1349
0
    }
1350
}
1351
1352
impl<'de, I, E> de::MapAccess<'de> for MapDeserializer<'de, I, E>
1353
where
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
0
    fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1363
0
    where
1364
0
        T: de::DeserializeSeed<'de>,
1365
0
    {
1366
0
        match self.next_pair() {
1367
0
            Some((key, value)) => {
1368
0
                self.value = Some(value);
1369
0
                seed.deserialize(key.into_deserializer()).map(Some)
1370
            }
1371
0
            None => Ok(None),
1372
        }
1373
0
    }
1374
1375
0
    fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
1376
0
    where
1377
0
        T: de::DeserializeSeed<'de>,
1378
0
    {
1379
0
        let value = self.value.take();
1380
0
        // Panic because this indicates a bug in the program rather than an
1381
0
        // expected failure.
1382
0
        let value = value.expect("MapAccess::next_value called before next_key");
1383
0
        seed.deserialize(value.into_deserializer())
1384
0
    }
1385
1386
0
    fn next_entry_seed<TK, TV>(
1387
0
        &mut self,
1388
0
        kseed: TK,
1389
0
        vseed: TV,
1390
0
    ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error>
1391
0
    where
1392
0
        TK: de::DeserializeSeed<'de>,
1393
0
        TV: de::DeserializeSeed<'de>,
1394
0
    {
1395
0
        match self.next_pair() {
1396
0
            Some((key, value)) => {
1397
0
                let key = tri!(kseed.deserialize(key.into_deserializer()));
1398
0
                let value = tri!(vseed.deserialize(value.into_deserializer()));
1399
0
                Ok(Some((key, value)))
1400
            }
1401
0
            None => Ok(None),
1402
        }
1403
0
    }
1404
1405
0
    fn size_hint(&self) -> Option<usize> {
1406
0
        size_hint::from_bounds(&self.iter)
1407
0
    }
1408
}
1409
1410
impl<'de, I, E> de::SeqAccess<'de> for MapDeserializer<'de, I, E>
1411
where
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
0
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1421
0
    where
1422
0
        T: de::DeserializeSeed<'de>,
1423
0
    {
1424
0
        match self.next_pair() {
1425
0
            Some((k, v)) => {
1426
0
                let de = PairDeserializer(k, v, PhantomData);
1427
0
                seed.deserialize(de).map(Some)
1428
            }
1429
0
            None => Ok(None),
1430
        }
1431
0
    }
1432
1433
0
    fn size_hint(&self) -> Option<usize> {
1434
0
        size_hint::from_bounds(&self.iter)
1435
0
    }
1436
}
1437
1438
// Cannot #[derive(Clone)] because of the bound `Second<I::Item>: Clone`.
1439
impl<'de, I, E> Clone for MapDeserializer<'de, I, E>
1440
where
1441
    I: Iterator + Clone,
1442
    I::Item: private::Pair,
1443
    Second<I::Item>: Clone,
1444
{
1445
0
    fn clone(&self) -> Self {
1446
0
        MapDeserializer {
1447
0
            iter: self.iter.clone(),
1448
0
            value: self.value.clone(),
1449
0
            count: self.count,
1450
0
            lifetime: self.lifetime,
1451
0
            error: self.error,
1452
0
        }
1453
0
    }
1454
}
1455
1456
impl<'de, I, E> Debug for MapDeserializer<'de, I, E>
1457
where
1458
    I: Iterator + Debug,
1459
    I::Item: private::Pair,
1460
    Second<I::Item>: Debug,
1461
{
1462
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1463
0
        formatter
1464
0
            .debug_struct("MapDeserializer")
1465
0
            .field("iter", &self.iter)
1466
0
            .field("value", &self.value)
1467
0
            .field("count", &self.count)
1468
0
            .finish()
1469
0
    }
1470
}
1471
1472
// Used in the `impl SeqAccess for MapDeserializer` to visit the map as a
1473
// sequence of pairs.
1474
struct PairDeserializer<A, B, E>(A, B, PhantomData<E>);
1475
1476
impl<'de, A, B, E> de::Deserializer<'de> for PairDeserializer<A, B, E>
1477
where
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
0
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1491
0
    where
1492
0
        V: de::Visitor<'de>,
1493
0
    {
1494
0
        self.deserialize_seq(visitor)
1495
0
    }
1496
1497
0
    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1498
0
    where
1499
0
        V: de::Visitor<'de>,
1500
0
    {
1501
0
        let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData);
1502
0
        let pair = tri!(visitor.visit_seq(&mut pair_visitor));
1503
0
        if pair_visitor.1.is_none() {
1504
0
            Ok(pair)
1505
        } else {
1506
0
            let remaining = pair_visitor.size_hint().unwrap();
1507
0
            // First argument is the number of elements in the data, second
1508
0
            // argument is the number of elements expected by the Deserialize.
1509
0
            Err(de::Error::invalid_length(2, &ExpectedInSeq(2 - remaining)))
1510
        }
1511
0
    }
1512
1513
0
    fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1514
0
    where
1515
0
        V: de::Visitor<'de>,
1516
0
    {
1517
0
        if len == 2 {
1518
0
            self.deserialize_seq(visitor)
1519
        } else {
1520
            // First argument is the number of elements in the data, second
1521
            // argument is the number of elements expected by the Deserialize.
1522
0
            Err(de::Error::invalid_length(2, &ExpectedInSeq(len)))
1523
        }
1524
0
    }
1525
}
1526
1527
struct PairVisitor<A, B, E>(Option<A>, Option<B>, PhantomData<E>);
1528
1529
impl<'de, A, B, E> de::SeqAccess<'de> for PairVisitor<A, B, E>
1530
where
1531
    A: IntoDeserializer<'de, E>,
1532
    B: IntoDeserializer<'de, E>,
1533
    E: de::Error,
1534
{
1535
    type Error = E;
1536
1537
0
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1538
0
    where
1539
0
        T: de::DeserializeSeed<'de>,
1540
0
    {
1541
0
        if let Some(k) = self.0.take() {
1542
0
            seed.deserialize(k.into_deserializer()).map(Some)
1543
0
        } else if let Some(v) = self.1.take() {
1544
0
            seed.deserialize(v.into_deserializer()).map(Some)
1545
        } else {
1546
0
            Ok(None)
1547
        }
1548
0
    }
1549
1550
0
    fn size_hint(&self) -> Option<usize> {
1551
0
        if self.0.is_some() {
1552
0
            Some(2)
1553
0
        } else if self.1.is_some() {
1554
0
            Some(1)
1555
        } else {
1556
0
            Some(0)
1557
        }
1558
0
    }
1559
}
1560
1561
struct ExpectedInMap(usize);
1562
1563
impl Expected for ExpectedInMap {
1564
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1565
0
        if self.0 == 1 {
1566
0
            formatter.write_str("1 element in map")
1567
        } else {
1568
0
            write!(formatter, "{} elements in map", self.0)
1569
        }
1570
0
    }
1571
}
1572
1573
////////////////////////////////////////////////////////////////////////////////
1574
1575
#[cfg(any(feature = "std", feature = "alloc"))]
1576
#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
1577
impl<'de, K, V, E> IntoDeserializer<'de, E> for BTreeMap<K, V>
1578
where
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
0
    fn into_deserializer(self) -> Self::Deserializer {
1586
0
        MapDeserializer::new(self.into_iter())
1587
0
    }
1588
}
1589
1590
#[cfg(feature = "std")]
1591
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
1592
impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S>
1593
where
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
0
    fn into_deserializer(self) -> Self::Deserializer {
1602
0
        MapDeserializer::new(self.into_iter())
1603
0
    }
1604
}
1605
1606
////////////////////////////////////////////////////////////////////////////////
1607
1608
/// A deserializer holding a `MapAccess`.
1609
#[derive(Clone, Debug)]
1610
pub struct MapAccessDeserializer<A> {
1611
    map: A,
1612
}
1613
1614
impl<A> MapAccessDeserializer<A> {
1615
    /// Construct a new `MapAccessDeserializer<A>`.
1616
1.15M
    pub fn new(map: A) -> Self {
1617
1.15M
        MapAccessDeserializer { map }
1618
1.15M
    }
<serde::de::value::MapAccessDeserializer<&mut serde_yaml::de::MapAccess>>::new
Line
Count
Source
1616
1.15M
    pub fn new(map: A) -> Self {
1617
1.15M
        MapAccessDeserializer { map }
1618
1.15M
    }
Unexecuted instantiation: <serde::de::value::MapAccessDeserializer<_>>::new
1619
}
1620
1621
impl<'de, A> de::Deserializer<'de> for MapAccessDeserializer<A>
1622
where
1623
    A: de::MapAccess<'de>,
1624
{
1625
    type Error = A::Error;
1626
1627
1.15M
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1628
1.15M
    where
1629
1.15M
        V: de::Visitor<'de>,
1630
1.15M
    {
1631
1.15M
        visitor.visit_map(self.map)
1632
1.15M
    }
<serde::de::value::MapAccessDeserializer<&mut serde_yaml::de::MapAccess> as serde::de::Deserializer>::deserialize_any::<<serde_yaml::mapping::Mapping as serde::de::Deserialize>::deserialize::Visitor>
Line
Count
Source
1627
1.15M
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1628
1.15M
    where
1629
1.15M
        V: de::Visitor<'de>,
1630
1.15M
    {
1631
1.15M
        visitor.visit_map(self.map)
1632
1.15M
    }
Unexecuted instantiation: <serde::de::value::MapAccessDeserializer<_> as serde::de::Deserializer>::deserialize_any::<_>
1633
1634
0
    fn deserialize_enum<V>(
1635
0
        self,
1636
0
        _name: &str,
1637
0
        _variants: &'static [&'static str],
1638
0
        visitor: V,
1639
0
    ) -> Result<V::Value, Self::Error>
1640
0
    where
1641
0
        V: de::Visitor<'de>,
1642
0
    {
1643
0
        visitor.visit_enum(self)
1644
0
    }
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
1653
impl<'de, A> IntoDeserializer<'de, A::Error> for MapAccessDeserializer<A>
1654
where
1655
    A: de::MapAccess<'de>,
1656
{
1657
    type Deserializer = Self;
1658
1659
0
    fn into_deserializer(self) -> Self {
1660
0
        self
1661
0
    }
1662
}
1663
1664
impl<'de, A> de::EnumAccess<'de> for MapAccessDeserializer<A>
1665
where
1666
    A: de::MapAccess<'de>,
1667
{
1668
    type Error = A::Error;
1669
    type Variant = private::MapAsEnum<A>;
1670
1671
0
    fn variant_seed<T>(mut self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error>
1672
0
    where
1673
0
        T: de::DeserializeSeed<'de>,
1674
0
    {
1675
0
        match tri!(self.map.next_key_seed(seed)) {
1676
0
            Some(key) => Ok((key, private::map_as_enum(self.map))),
1677
0
            None => Err(de::Error::invalid_type(de::Unexpected::Map, &"enum")),
1678
        }
1679
0
    }
1680
}
1681
1682
////////////////////////////////////////////////////////////////////////////////
1683
1684
/// A deserializer holding an `EnumAccess`.
1685
#[derive(Clone, Debug)]
1686
pub struct EnumAccessDeserializer<A> {
1687
    access: A,
1688
}
1689
1690
impl<A> EnumAccessDeserializer<A> {
1691
    /// Construct a new `EnumAccessDeserializer<A>`.
1692
0
    pub fn new(access: A) -> Self {
1693
0
        EnumAccessDeserializer { access }
1694
0
    }
1695
}
1696
1697
impl<'de, A> de::Deserializer<'de> for EnumAccessDeserializer<A>
1698
where
1699
    A: de::EnumAccess<'de>,
1700
{
1701
    type Error = A::Error;
1702
1703
0
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1704
0
    where
1705
0
        V: de::Visitor<'de>,
1706
0
    {
1707
0
        visitor.visit_enum(self.access)
1708
0
    }
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
1717
impl<'de, A> IntoDeserializer<'de, A::Error> for EnumAccessDeserializer<A>
1718
where
1719
    A: de::EnumAccess<'de>,
1720
{
1721
    type Deserializer = Self;
1722
1723
0
    fn into_deserializer(self) -> Self {
1724
0
        self
1725
0
    }
1726
}
1727
1728
////////////////////////////////////////////////////////////////////////////////
1729
1730
mod 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
0
    pub fn unit_only<T, E>(t: T) -> (T, UnitOnly<E>) {
1742
0
        (
1743
0
            t,
1744
0
            UnitOnly {
1745
0
                marker: PhantomData,
1746
0
            },
1747
0
        )
1748
0
    }
1749
1750
    impl<'de, E> de::VariantAccess<'de> for UnitOnly<E>
1751
    where
1752
        E: de::Error,
1753
    {
1754
        type Error = E;
1755
1756
0
        fn unit_variant(self) -> Result<(), Self::Error> {
1757
0
            Ok(())
1758
0
        }
1759
1760
0
        fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>
1761
0
        where
1762
0
            T: de::DeserializeSeed<'de>,
1763
0
        {
1764
0
            Err(de::Error::invalid_type(
1765
0
                Unexpected::UnitVariant,
1766
0
                &"newtype variant",
1767
0
            ))
1768
0
        }
1769
1770
0
        fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>
1771
0
        where
1772
0
            V: de::Visitor<'de>,
1773
0
        {
1774
0
            Err(de::Error::invalid_type(
1775
0
                Unexpected::UnitVariant,
1776
0
                &"tuple variant",
1777
0
            ))
1778
0
        }
1779
1780
0
        fn struct_variant<V>(
1781
0
            self,
1782
0
            _fields: &'static [&'static str],
1783
0
            _visitor: V,
1784
0
        ) -> Result<V::Value, Self::Error>
1785
0
        where
1786
0
            V: de::Visitor<'de>,
1787
0
        {
1788
0
            Err(de::Error::invalid_type(
1789
0
                Unexpected::UnitVariant,
1790
0
                &"struct variant",
1791
0
            ))
1792
0
        }
1793
    }
1794
1795
    pub struct MapAsEnum<A> {
1796
        map: A,
1797
    }
1798
1799
0
    pub fn map_as_enum<A>(map: A) -> MapAsEnum<A> {
1800
0
        MapAsEnum { map }
1801
0
    }
1802
1803
    impl<'de, A> VariantAccess<'de> for MapAsEnum<A>
1804
    where
1805
        A: MapAccess<'de>,
1806
    {
1807
        type Error = A::Error;
1808
1809
0
        fn unit_variant(mut self) -> Result<(), Self::Error> {
1810
0
            self.map.next_value()
1811
0
        }
1812
1813
0
        fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error>
1814
0
        where
1815
0
            T: DeserializeSeed<'de>,
1816
0
        {
1817
0
            self.map.next_value_seed(seed)
1818
0
        }
1819
1820
0
        fn tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1821
0
        where
1822
0
            V: Visitor<'de>,
1823
0
        {
1824
0
            self.map.next_value_seed(SeedTupleVariant { len, visitor })
1825
0
        }
1826
1827
0
        fn struct_variant<V>(
1828
0
            mut self,
1829
0
            _fields: &'static [&'static str],
1830
0
            visitor: V,
1831
0
        ) -> Result<V::Value, Self::Error>
1832
0
        where
1833
0
            V: Visitor<'de>,
1834
0
        {
1835
0
            self.map.next_value_seed(SeedStructVariant { visitor })
1836
0
        }
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
0
        fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1851
0
        where
1852
0
            D: Deserializer<'de>,
1853
0
        {
1854
0
            deserializer.deserialize_tuple(self.len, self.visitor)
1855
0
        }
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
0
        fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1869
0
        where
1870
0
            D: Deserializer<'de>,
1871
0
        {
1872
0
            deserializer.deserialize_map(self.visitor)
1873
0
        }
1874
    }
1875
1876
    /// Avoid having to restate the generic types on `MapDeserializer`. The
1877
    /// `Iterator::Item` contains enough information to figure out K and V.
1878
    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
0
        fn split(self) -> (A, B) {
1888
0
            self
1889
0
        }
1890
    }
1891
1892
    pub type First<T> = <T as Pair>::First;
1893
    pub type Second<T> = <T as Pair>::Second;
1894
}