• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! Generic data structure deserialization framework.
2 //!
3 //! The two most important traits in this module are [`Deserialize`] and
4 //! [`Deserializer`].
5 //!
6 //!  - **A type that implements `Deserialize` is a data structure** that can be
7 //!    deserialized from any data format supported by Serde, and conversely
8 //!  - **A type that implements `Deserializer` is a data format** that can
9 //!    deserialize any data structure supported by Serde.
10 //!
11 //! # The Deserialize trait
12 //!
13 //! Serde provides [`Deserialize`] implementations for many Rust primitive and
14 //! standard library types. The complete list is below. All of these can be
15 //! deserialized using Serde out of the box.
16 //!
17 //! Additionally, Serde provides a procedural macro called [`serde_derive`] to
18 //! automatically generate [`Deserialize`] implementations for structs and enums
19 //! in your program. See the [derive section of the manual] for how to use this.
20 //!
21 //! In rare cases it may be necessary to implement [`Deserialize`] manually for
22 //! some type in your program. See the [Implementing `Deserialize`] section of
23 //! the manual for more about this.
24 //!
25 //! Third-party crates may provide [`Deserialize`] implementations for types
26 //! that they expose. For example the [`linked-hash-map`] crate provides a
27 //! [`LinkedHashMap<K, V>`] type that is deserializable by Serde because the
28 //! crate provides an implementation of [`Deserialize`] for it.
29 //!
30 //! # The Deserializer trait
31 //!
32 //! [`Deserializer`] implementations are provided by third-party crates, for
33 //! example [`serde_json`], [`serde_yaml`] and [`postcard`].
34 //!
35 //! A partial list of well-maintained formats is given on the [Serde
36 //! website][data formats].
37 //!
38 //! # Implementations of Deserialize provided by Serde
39 //!
40 //! This is a slightly different set of types than what is supported for
41 //! serialization. Some types can be serialized by Serde but not deserialized.
42 //! One example is `OsStr`.
43 //!
44 //!  - **Primitive types**:
45 //!    - bool
46 //!    - i8, i16, i32, i64, i128, isize
47 //!    - u8, u16, u32, u64, u128, usize
48 //!    - f32, f64
49 //!    - char
50 //!  - **Compound types**:
51 //!    - \[T; 0\] through \[T; 32\]
52 //!    - tuples up to size 16
53 //!  - **Common standard library types**:
54 //!    - String
55 //!    - Option\<T\>
56 //!    - Result\<T, E\>
57 //!    - PhantomData\<T\>
58 //!  - **Wrapper types**:
59 //!    - Box\<T\>
60 //!    - Box\<\[T\]\>
61 //!    - Box\<str\>
62 //!    - Cow\<'a, T\>
63 //!    - Cell\<T\>
64 //!    - RefCell\<T\>
65 //!    - Mutex\<T\>
66 //!    - RwLock\<T\>
67 //!    - Rc\<T\>&emsp;*(if* features = \["rc"\] *is enabled)*
68 //!    - Arc\<T\>&emsp;*(if* features = \["rc"\] *is enabled)*
69 //!  - **Collection types**:
70 //!    - BTreeMap\<K, V\>
71 //!    - BTreeSet\<T\>
72 //!    - BinaryHeap\<T\>
73 //!    - HashMap\<K, V, H\>
74 //!    - HashSet\<T, H\>
75 //!    - LinkedList\<T\>
76 //!    - VecDeque\<T\>
77 //!    - Vec\<T\>
78 //!  - **Zero-copy types**:
79 //!    - &str
80 //!    - &\[u8\]
81 //!  - **FFI types**:
82 //!    - CString
83 //!    - Box\<CStr\>
84 //!    - OsString
85 //!  - **Miscellaneous standard library types**:
86 //!    - Duration
87 //!    - SystemTime
88 //!    - Path
89 //!    - PathBuf
90 //!    - Range\<T\>
91 //!    - RangeInclusive\<T\>
92 //!    - Bound\<T\>
93 //!    - num::NonZero*
94 //!    - `!` *(unstable)*
95 //!  - **Net types**:
96 //!    - IpAddr
97 //!    - Ipv4Addr
98 //!    - Ipv6Addr
99 //!    - SocketAddr
100 //!    - SocketAddrV4
101 //!    - SocketAddrV6
102 //!
103 //! [Implementing `Deserialize`]: https://serde.rs/impl-deserialize.html
104 //! [`Deserialize`]: ../trait.Deserialize.html
105 //! [`Deserializer`]: ../trait.Deserializer.html
106 //! [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html
107 //! [`postcard`]: https://github.com/jamesmunns/postcard
108 //! [`linked-hash-map`]: https://crates.io/crates/linked-hash-map
109 //! [`serde_derive`]: https://crates.io/crates/serde_derive
110 //! [`serde_json`]: https://github.com/serde-rs/json
111 //! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml
112 //! [derive section of the manual]: https://serde.rs/derive.html
113 //! [data formats]: https://serde.rs/#data-formats
114 
115 use crate::lib::*;
116 
117 ////////////////////////////////////////////////////////////////////////////////
118 
119 pub mod value;
120 
121 mod format;
122 mod ignored_any;
123 mod impls;
124 pub(crate) mod size_hint;
125 
126 pub use self::ignored_any::IgnoredAny;
127 
128 #[cfg(not(any(feature = "std", feature = "unstable")))]
129 #[doc(no_inline)]
130 pub use crate::std_error::Error as StdError;
131 #[cfg(all(feature = "unstable", not(feature = "std")))]
132 #[doc(no_inline)]
133 pub use core::error::Error as StdError;
134 #[cfg(feature = "std")]
135 #[doc(no_inline)]
136 pub use std::error::Error as StdError;
137 
138 ////////////////////////////////////////////////////////////////////////////////
139 
140 macro_rules! declare_error_trait {
141     (Error: Sized $(+ $($supertrait:ident)::+)*) => {
142         /// The `Error` trait allows `Deserialize` implementations to create descriptive
143         /// error messages belonging to the `Deserializer` against which they are
144         /// currently running.
145         ///
146         /// Every `Deserializer` declares an `Error` type that encompasses both
147         /// general-purpose deserialization errors as well as errors specific to the
148         /// particular deserialization format. For example the `Error` type of
149         /// `serde_json` can represent errors like an invalid JSON escape sequence or an
150         /// unterminated string literal, in addition to the error cases that are part of
151         /// this trait.
152         ///
153         /// Most deserializers should only need to provide the `Error::custom` method
154         /// and inherit the default behavior for the other methods.
155         ///
156         /// # Example implementation
157         ///
158         /// The [example data format] presented on the website shows an error
159         /// type appropriate for a basic JSON data format.
160         ///
161         /// [example data format]: https://serde.rs/data-format.html
162         pub trait Error: Sized $(+ $($supertrait)::+)* {
163             /// Raised when there is general error when deserializing a type.
164             ///
165             /// The message should not be capitalized and should not end with a period.
166             ///
167             /// ```edition2021
168             /// # use std::str::FromStr;
169             /// #
170             /// # struct IpAddr;
171             /// #
172             /// # impl FromStr for IpAddr {
173             /// #     type Err = String;
174             /// #
175             /// #     fn from_str(_: &str) -> Result<Self, String> {
176             /// #         unimplemented!()
177             /// #     }
178             /// # }
179             /// #
180             /// use serde::de::{self, Deserialize, Deserializer};
181             ///
182             /// impl<'de> Deserialize<'de> for IpAddr {
183             ///     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
184             ///     where
185             ///         D: Deserializer<'de>,
186             ///     {
187             ///         let s = String::deserialize(deserializer)?;
188             ///         s.parse().map_err(de::Error::custom)
189             ///     }
190             /// }
191             /// ```
192             fn custom<T>(msg: T) -> Self
193             where
194                 T: Display;
195 
196             /// Raised when a `Deserialize` receives a type different from what it was
197             /// expecting.
198             ///
199             /// The `unexp` argument provides information about what type was received.
200             /// This is the type that was present in the input file or other source data
201             /// of the Deserializer.
202             ///
203             /// The `exp` argument provides information about what type was being
204             /// expected. This is the type that is written in the program.
205             ///
206             /// For example if we try to deserialize a String out of a JSON file
207             /// containing an integer, the unexpected type is the integer and the
208             /// expected type is the string.
209             #[cold]
210             fn invalid_type(unexp: Unexpected, exp: &Expected) -> Self {
211                 Error::custom(format_args!("invalid type: {}, expected {}", unexp, exp))
212             }
213 
214             /// Raised when a `Deserialize` receives a value of the right type but that
215             /// is wrong for some other reason.
216             ///
217             /// The `unexp` argument provides information about what value was received.
218             /// This is the value that was present in the input file or other source
219             /// data of the Deserializer.
220             ///
221             /// The `exp` argument provides information about what value was being
222             /// expected. This is the type that is written in the program.
223             ///
224             /// For example if we try to deserialize a String out of some binary data
225             /// that is not valid UTF-8, the unexpected value is the bytes and the
226             /// expected value is a string.
227             #[cold]
228             fn invalid_value(unexp: Unexpected, exp: &Expected) -> Self {
229                 Error::custom(format_args!("invalid value: {}, expected {}", unexp, exp))
230             }
231 
232             /// Raised when deserializing a sequence or map and the input data contains
233             /// too many or too few elements.
234             ///
235             /// The `len` argument is the number of elements encountered. The sequence
236             /// or map may have expected more arguments or fewer arguments.
237             ///
238             /// The `exp` argument provides information about what data was being
239             /// expected. For example `exp` might say that a tuple of size 6 was
240             /// expected.
241             #[cold]
242             fn invalid_length(len: usize, exp: &Expected) -> Self {
243                 Error::custom(format_args!("invalid length {}, expected {}", len, exp))
244             }
245 
246             /// Raised when a `Deserialize` enum type received a variant with an
247             /// unrecognized name.
248             #[cold]
249             fn unknown_variant(variant: &str, expected: &'static [&'static str]) -> Self {
250                 if expected.is_empty() {
251                     Error::custom(format_args!(
252                         "unknown variant `{}`, there are no variants",
253                         variant
254                     ))
255                 } else {
256                     Error::custom(format_args!(
257                         "unknown variant `{}`, expected {}",
258                         variant,
259                         OneOf { names: expected }
260                     ))
261                 }
262             }
263 
264             /// Raised when a `Deserialize` struct type received a field with an
265             /// unrecognized name.
266             #[cold]
267             fn unknown_field(field: &str, expected: &'static [&'static str]) -> Self {
268                 if expected.is_empty() {
269                     Error::custom(format_args!(
270                         "unknown field `{}`, there are no fields",
271                         field
272                     ))
273                 } else {
274                     Error::custom(format_args!(
275                         "unknown field `{}`, expected {}",
276                         field,
277                         OneOf { names: expected }
278                     ))
279                 }
280             }
281 
282             /// Raised when a `Deserialize` struct type expected to receive a required
283             /// field with a particular name but that field was not present in the
284             /// input.
285             #[cold]
286             fn missing_field(field: &'static str) -> Self {
287                 Error::custom(format_args!("missing field `{}`", field))
288             }
289 
290             /// Raised when a `Deserialize` struct type received more than one of the
291             /// same field.
292             #[cold]
293             fn duplicate_field(field: &'static str) -> Self {
294                 Error::custom(format_args!("duplicate field `{}`", field))
295             }
296         }
297     }
298 }
299 
300 #[cfg(feature = "std")]
301 declare_error_trait!(Error: Sized + StdError);
302 
303 #[cfg(not(feature = "std"))]
304 declare_error_trait!(Error: Sized + Debug + Display);
305 
306 /// `Unexpected` represents an unexpected invocation of any one of the `Visitor`
307 /// trait methods.
308 ///
309 /// This is used as an argument to the `invalid_type`, `invalid_value`, and
310 /// `invalid_length` methods of the `Error` trait to build error messages.
311 ///
312 /// ```edition2021
313 /// # use std::fmt;
314 /// #
315 /// # use serde::de::{self, Unexpected, Visitor};
316 /// #
317 /// # struct Example;
318 /// #
319 /// # impl<'de> Visitor<'de> for Example {
320 /// #     type Value = ();
321 /// #
322 /// #     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
323 /// #         write!(formatter, "definitely not a boolean")
324 /// #     }
325 /// #
326 /// fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
327 /// where
328 ///     E: de::Error,
329 /// {
330 ///     Err(de::Error::invalid_type(Unexpected::Bool(v), &self))
331 /// }
332 /// # }
333 /// ```
334 #[derive(Copy, Clone, PartialEq, Debug)]
335 pub enum Unexpected<'a> {
336     /// The input contained a boolean value that was not expected.
337     Bool(bool),
338 
339     /// The input contained an unsigned integer `u8`, `u16`, `u32` or `u64` that
340     /// was not expected.
341     Unsigned(u64),
342 
343     /// The input contained a signed integer `i8`, `i16`, `i32` or `i64` that
344     /// was not expected.
345     Signed(i64),
346 
347     /// The input contained a floating point `f32` or `f64` that was not
348     /// expected.
349     Float(f64),
350 
351     /// The input contained a `char` that was not expected.
352     Char(char),
353 
354     /// The input contained a `&str` or `String` that was not expected.
355     Str(&'a str),
356 
357     /// The input contained a `&[u8]` or `Vec<u8>` that was not expected.
358     Bytes(&'a [u8]),
359 
360     /// The input contained a unit `()` that was not expected.
361     Unit,
362 
363     /// The input contained an `Option<T>` that was not expected.
364     Option,
365 
366     /// The input contained a newtype struct that was not expected.
367     NewtypeStruct,
368 
369     /// The input contained a sequence that was not expected.
370     Seq,
371 
372     /// The input contained a map that was not expected.
373     Map,
374 
375     /// The input contained an enum that was not expected.
376     Enum,
377 
378     /// The input contained a unit variant that was not expected.
379     UnitVariant,
380 
381     /// The input contained a newtype variant that was not expected.
382     NewtypeVariant,
383 
384     /// The input contained a tuple variant that was not expected.
385     TupleVariant,
386 
387     /// The input contained a struct variant that was not expected.
388     StructVariant,
389 
390     /// A message stating what uncategorized thing the input contained that was
391     /// not expected.
392     ///
393     /// The message should be a noun or noun phrase, not capitalized and without
394     /// a period. An example message is "unoriginal superhero".
395     Other(&'a str),
396 }
397 
398 impl<'a> fmt::Display for Unexpected<'a> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result399     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
400         use self::Unexpected::*;
401         match *self {
402             Bool(b) => write!(formatter, "boolean `{}`", b),
403             Unsigned(i) => write!(formatter, "integer `{}`", i),
404             Signed(i) => write!(formatter, "integer `{}`", i),
405             Float(f) => write!(formatter, "floating point `{}`", WithDecimalPoint(f)),
406             Char(c) => write!(formatter, "character `{}`", c),
407             Str(s) => write!(formatter, "string {:?}", s),
408             Bytes(_) => formatter.write_str("byte array"),
409             Unit => formatter.write_str("unit value"),
410             Option => formatter.write_str("Option value"),
411             NewtypeStruct => formatter.write_str("newtype struct"),
412             Seq => formatter.write_str("sequence"),
413             Map => formatter.write_str("map"),
414             Enum => formatter.write_str("enum"),
415             UnitVariant => formatter.write_str("unit variant"),
416             NewtypeVariant => formatter.write_str("newtype variant"),
417             TupleVariant => formatter.write_str("tuple variant"),
418             StructVariant => formatter.write_str("struct variant"),
419             Other(other) => formatter.write_str(other),
420         }
421     }
422 }
423 
424 /// `Expected` represents an explanation of what data a `Visitor` was expecting
425 /// to receive.
426 ///
427 /// This is used as an argument to the `invalid_type`, `invalid_value`, and
428 /// `invalid_length` methods of the `Error` trait to build error messages. The
429 /// message should be a noun or noun phrase that completes the sentence "This
430 /// Visitor expects to receive ...", for example the message could be "an
431 /// integer between 0 and 64". The message should not be capitalized and should
432 /// not end with a period.
433 ///
434 /// Within the context of a `Visitor` implementation, the `Visitor` itself
435 /// (`&self`) is an implementation of this trait.
436 ///
437 /// ```edition2021
438 /// # use serde::de::{self, Unexpected, Visitor};
439 /// # use std::fmt;
440 /// #
441 /// # struct Example;
442 /// #
443 /// # impl<'de> Visitor<'de> for Example {
444 /// #     type Value = ();
445 /// #
446 /// #     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
447 /// #         write!(formatter, "definitely not a boolean")
448 /// #     }
449 /// #
450 /// fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
451 /// where
452 ///     E: de::Error,
453 /// {
454 ///     Err(de::Error::invalid_type(Unexpected::Bool(v), &self))
455 /// }
456 /// # }
457 /// ```
458 ///
459 /// Outside of a `Visitor`, `&"..."` can be used.
460 ///
461 /// ```edition2021
462 /// # use serde::de::{self, Unexpected};
463 /// #
464 /// # fn example<E>() -> Result<(), E>
465 /// # where
466 /// #     E: de::Error,
467 /// # {
468 /// #     let v = true;
469 /// return Err(de::Error::invalid_type(
470 ///     Unexpected::Bool(v),
471 ///     &"a negative integer",
472 /// ));
473 /// # }
474 /// ```
475 pub trait Expected {
476     /// Format an explanation of what data was being expected. Same signature as
477     /// the `Display` and `Debug` traits.
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result478     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result;
479 }
480 
481 impl<'de, T> Expected for T
482 where
483     T: Visitor<'de>,
484 {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result485     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
486         self.expecting(formatter)
487     }
488 }
489 
490 impl<'a> Expected for &'a str {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result491     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
492         formatter.write_str(self)
493     }
494 }
495 
496 impl<'a> Display for Expected + 'a {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result497     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
498         Expected::fmt(self, formatter)
499     }
500 }
501 
502 ////////////////////////////////////////////////////////////////////////////////
503 
504 /// A **data structure** that can be deserialized from any data format supported
505 /// by Serde.
506 ///
507 /// Serde provides `Deserialize` implementations for many Rust primitive and
508 /// standard library types. The complete list is [here][crate::de]. All of these
509 /// can be deserialized using Serde out of the box.
510 ///
511 /// Additionally, Serde provides a procedural macro called `serde_derive` to
512 /// automatically generate `Deserialize` implementations for structs and enums
513 /// in your program. See the [derive section of the manual][derive] for how to
514 /// use this.
515 ///
516 /// In rare cases it may be necessary to implement `Deserialize` manually for
517 /// some type in your program. See the [Implementing
518 /// `Deserialize`][impl-deserialize] section of the manual for more about this.
519 ///
520 /// Third-party crates may provide `Deserialize` implementations for types that
521 /// they expose. For example the `linked-hash-map` crate provides a
522 /// `LinkedHashMap<K, V>` type that is deserializable by Serde because the crate
523 /// provides an implementation of `Deserialize` for it.
524 ///
525 /// [derive]: https://serde.rs/derive.html
526 /// [impl-deserialize]: https://serde.rs/impl-deserialize.html
527 ///
528 /// # Lifetime
529 ///
530 /// The `'de` lifetime of this trait is the lifetime of data that may be
531 /// borrowed by `Self` when deserialized. See the page [Understanding
532 /// deserializer lifetimes] for a more detailed explanation of these lifetimes.
533 ///
534 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
535 pub trait Deserialize<'de>: Sized {
536     /// Deserialize this value from the given Serde deserializer.
537     ///
538     /// See the [Implementing `Deserialize`][impl-deserialize] section of the
539     /// manual for more information about how to implement this method.
540     ///
541     /// [impl-deserialize]: https://serde.rs/impl-deserialize.html
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>542     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
543     where
544         D: Deserializer<'de>;
545 
546     /// Deserializes a value into `self` from the given Deserializer.
547     ///
548     /// The purpose of this method is to allow the deserializer to reuse
549     /// resources and avoid copies. As such, if this method returns an error,
550     /// `self` will be in an indeterminate state where some parts of the struct
551     /// have been overwritten. Although whatever state that is will be
552     /// memory-safe.
553     ///
554     /// This is generally useful when repeatedly deserializing values that
555     /// are processed one at a time, where the value of `self` doesn't matter
556     /// when the next deserialization occurs.
557     ///
558     /// If you manually implement this, your recursive deserializations should
559     /// use `deserialize_in_place`.
560     ///
561     /// This method is stable and an official public API, but hidden from the
562     /// documentation because it is almost never what newbies are looking for.
563     /// Showing it in rustdoc would cause it to be featured more prominently
564     /// than it deserves.
565     #[doc(hidden)]
deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error> where D: Deserializer<'de>,566     fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
567     where
568         D: Deserializer<'de>,
569     {
570         // Default implementation just delegates to `deserialize` impl.
571         *place = tri!(Deserialize::deserialize(deserializer));
572         Ok(())
573     }
574 }
575 
576 /// A data structure that can be deserialized without borrowing any data from
577 /// the deserializer.
578 ///
579 /// This is primarily useful for trait bounds on functions. For example a
580 /// `from_str` function may be able to deserialize a data structure that borrows
581 /// from the input string, but a `from_reader` function may only deserialize
582 /// owned data.
583 ///
584 /// ```edition2021
585 /// # use serde::de::{Deserialize, DeserializeOwned};
586 /// # use std::io::{Read, Result};
587 /// #
588 /// # trait Ignore {
589 /// fn from_str<'a, T>(s: &'a str) -> Result<T>
590 /// where
591 ///     T: Deserialize<'a>;
592 ///
593 /// fn from_reader<R, T>(rdr: R) -> Result<T>
594 /// where
595 ///     R: Read,
596 ///     T: DeserializeOwned;
597 /// # }
598 /// ```
599 ///
600 /// # Lifetime
601 ///
602 /// The relationship between `Deserialize` and `DeserializeOwned` in trait
603 /// bounds is explained in more detail on the page [Understanding deserializer
604 /// lifetimes].
605 ///
606 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
607 pub trait DeserializeOwned: for<'de> Deserialize<'de> {}
608 impl<T> DeserializeOwned for T where T: for<'de> Deserialize<'de> {}
609 
610 /// `DeserializeSeed` is the stateful form of the `Deserialize` trait. If you
611 /// ever find yourself looking for a way to pass data into a `Deserialize` impl,
612 /// this trait is the way to do it.
613 ///
614 /// As one example of stateful deserialization consider deserializing a JSON
615 /// array into an existing buffer. Using the `Deserialize` trait we could
616 /// deserialize a JSON array into a `Vec<T>` but it would be a freshly allocated
617 /// `Vec<T>`; there is no way for `Deserialize` to reuse a previously allocated
618 /// buffer. Using `DeserializeSeed` instead makes this possible as in the
619 /// example code below.
620 ///
621 /// The canonical API for stateless deserialization looks like this:
622 ///
623 /// ```edition2021
624 /// # use serde::Deserialize;
625 /// #
626 /// # enum Error {}
627 /// #
628 /// fn func<'de, T: Deserialize<'de>>() -> Result<T, Error>
629 /// # {
630 /// #     unimplemented!()
631 /// # }
632 /// ```
633 ///
634 /// Adjusting an API like this to support stateful deserialization is a matter
635 /// of accepting a seed as input:
636 ///
637 /// ```edition2021
638 /// # use serde::de::DeserializeSeed;
639 /// #
640 /// # enum Error {}
641 /// #
642 /// fn func_seed<'de, T: DeserializeSeed<'de>>(seed: T) -> Result<T::Value, Error>
643 /// # {
644 /// #     let _ = seed;
645 /// #     unimplemented!()
646 /// # }
647 /// ```
648 ///
649 /// In practice the majority of deserialization is stateless. An API expecting a
650 /// seed can be appeased by passing `std::marker::PhantomData` as a seed in the
651 /// case of stateless deserialization.
652 ///
653 /// # Lifetime
654 ///
655 /// The `'de` lifetime of this trait is the lifetime of data that may be
656 /// borrowed by `Self::Value` when deserialized. See the page [Understanding
657 /// deserializer lifetimes] for a more detailed explanation of these lifetimes.
658 ///
659 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
660 ///
661 /// # Example
662 ///
663 /// Suppose we have JSON that looks like `[[1, 2], [3, 4, 5], [6]]` and we need
664 /// to deserialize it into a flat representation like `vec![1, 2, 3, 4, 5, 6]`.
665 /// Allocating a brand new `Vec<T>` for each subarray would be slow. Instead we
666 /// would like to allocate a single `Vec<T>` and then deserialize each subarray
667 /// into it. This requires stateful deserialization using the `DeserializeSeed`
668 /// trait.
669 ///
670 /// ```edition2021
671 /// use serde::de::{Deserialize, DeserializeSeed, Deserializer, SeqAccess, Visitor};
672 /// use std::fmt;
673 /// use std::marker::PhantomData;
674 ///
675 /// // A DeserializeSeed implementation that uses stateful deserialization to
676 /// // append array elements onto the end of an existing vector. The preexisting
677 /// // state ("seed") in this case is the Vec<T>. The `deserialize` method of
678 /// // `ExtendVec` will be traversing the inner arrays of the JSON input and
679 /// // appending each integer into the existing Vec.
680 /// struct ExtendVec<'a, T: 'a>(&'a mut Vec<T>);
681 ///
682 /// impl<'de, 'a, T> DeserializeSeed<'de> for ExtendVec<'a, T>
683 /// where
684 ///     T: Deserialize<'de>,
685 /// {
686 ///     // The return type of the `deserialize` method. This implementation
687 ///     // appends onto an existing vector but does not create any new data
688 ///     // structure, so the return type is ().
689 ///     type Value = ();
690 ///
691 ///     fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
692 ///     where
693 ///         D: Deserializer<'de>,
694 ///     {
695 ///         // Visitor implementation that will walk an inner array of the JSON
696 ///         // input.
697 ///         struct ExtendVecVisitor<'a, T: 'a>(&'a mut Vec<T>);
698 ///
699 ///         impl<'de, 'a, T> Visitor<'de> for ExtendVecVisitor<'a, T>
700 ///         where
701 ///             T: Deserialize<'de>,
702 ///         {
703 ///             type Value = ();
704 ///
705 ///             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
706 ///                 write!(formatter, "an array of integers")
707 ///             }
708 ///
709 ///             fn visit_seq<A>(self, mut seq: A) -> Result<(), A::Error>
710 ///             where
711 ///                 A: SeqAccess<'de>,
712 ///             {
713 ///                 // Decrease the number of reallocations if there are many elements
714 ///                 if let Some(size_hint) = seq.size_hint() {
715 ///                     self.0.reserve(size_hint);
716 ///                 }
717 ///
718 ///                 // Visit each element in the inner array and push it onto
719 ///                 // the existing vector.
720 ///                 while let Some(elem) = seq.next_element()? {
721 ///                     self.0.push(elem);
722 ///                 }
723 ///                 Ok(())
724 ///             }
725 ///         }
726 ///
727 ///         deserializer.deserialize_seq(ExtendVecVisitor(self.0))
728 ///     }
729 /// }
730 ///
731 /// // Visitor implementation that will walk the outer array of the JSON input.
732 /// struct FlattenedVecVisitor<T>(PhantomData<T>);
733 ///
734 /// impl<'de, T> Visitor<'de> for FlattenedVecVisitor<T>
735 /// where
736 ///     T: Deserialize<'de>,
737 /// {
738 ///     // This Visitor constructs a single Vec<T> to hold the flattened
739 ///     // contents of the inner arrays.
740 ///     type Value = Vec<T>;
741 ///
742 ///     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
743 ///         write!(formatter, "an array of arrays")
744 ///     }
745 ///
746 ///     fn visit_seq<A>(self, mut seq: A) -> Result<Vec<T>, A::Error>
747 ///     where
748 ///         A: SeqAccess<'de>,
749 ///     {
750 ///         // Create a single Vec to hold the flattened contents.
751 ///         let mut vec = Vec::new();
752 ///
753 ///         // Each iteration through this loop is one inner array.
754 ///         while let Some(()) = seq.next_element_seed(ExtendVec(&mut vec))? {
755 ///             // Nothing to do; inner array has been appended into `vec`.
756 ///         }
757 ///
758 ///         // Return the finished vec.
759 ///         Ok(vec)
760 ///     }
761 /// }
762 ///
763 /// # fn example<'de, D>(deserializer: D) -> Result<(), D::Error>
764 /// # where
765 /// #     D: Deserializer<'de>,
766 /// # {
767 /// let visitor = FlattenedVecVisitor(PhantomData);
768 /// let flattened: Vec<u64> = deserializer.deserialize_seq(visitor)?;
769 /// #     Ok(())
770 /// # }
771 /// ```
772 pub trait DeserializeSeed<'de>: Sized {
773     /// The type produced by using this seed.
774     type Value;
775 
776     /// Equivalent to the more common `Deserialize::deserialize` method, except
777     /// with some initial piece of data (the seed) passed in.
deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>778     fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
779     where
780         D: Deserializer<'de>;
781 }
782 
783 impl<'de, T> DeserializeSeed<'de> for PhantomData<T>
784 where
785     T: Deserialize<'de>,
786 {
787     type Value = T;
788 
789     #[inline]
deserialize<D>(self, deserializer: D) -> Result<T, D::Error> where D: Deserializer<'de>,790     fn deserialize<D>(self, deserializer: D) -> Result<T, D::Error>
791     where
792         D: Deserializer<'de>,
793     {
794         T::deserialize(deserializer)
795     }
796 }
797 
798 ////////////////////////////////////////////////////////////////////////////////
799 
800 /// A **data format** that can deserialize any data structure supported by
801 /// Serde.
802 ///
803 /// The role of this trait is to define the deserialization half of the [Serde
804 /// data model], which is a way to categorize every Rust data type into one of
805 /// 29 possible types. Each method of the `Deserializer` trait corresponds to one
806 /// of the types of the data model.
807 ///
808 /// Implementations of `Deserialize` map themselves into this data model by
809 /// passing to the `Deserializer` a `Visitor` implementation that can receive
810 /// these various types.
811 ///
812 /// The types that make up the Serde data model are:
813 ///
814 ///  - **14 primitive types**
815 ///    - bool
816 ///    - i8, i16, i32, i64, i128
817 ///    - u8, u16, u32, u64, u128
818 ///    - f32, f64
819 ///    - char
820 ///  - **string**
821 ///    - UTF-8 bytes with a length and no null terminator.
822 ///    - When serializing, all strings are handled equally. When deserializing,
823 ///      there are three flavors of strings: transient, owned, and borrowed.
824 ///  - **byte array** - \[u8\]
825 ///    - Similar to strings, during deserialization byte arrays can be
826 ///      transient, owned, or borrowed.
827 ///  - **option**
828 ///    - Either none or some value.
829 ///  - **unit**
830 ///    - The type of `()` in Rust. It represents an anonymous value containing
831 ///      no data.
832 ///  - **unit_struct**
833 ///    - For example `struct Unit` or `PhantomData<T>`. It represents a named
834 ///      value containing no data.
835 ///  - **unit_variant**
836 ///    - For example the `E::A` and `E::B` in `enum E { A, B }`.
837 ///  - **newtype_struct**
838 ///    - For example `struct Millimeters(u8)`.
839 ///  - **newtype_variant**
840 ///    - For example the `E::N` in `enum E { N(u8) }`.
841 ///  - **seq**
842 ///    - A variably sized heterogeneous sequence of values, for example `Vec<T>`
843 ///      or `HashSet<T>`. When serializing, the length may or may not be known
844 ///      before iterating through all the data. When deserializing, the length
845 ///      is determined by looking at the serialized data.
846 ///  - **tuple**
847 ///    - A statically sized heterogeneous sequence of values for which the
848 ///      length will be known at deserialization time without looking at the
849 ///      serialized data, for example `(u8,)` or `(String, u64, Vec<T>)` or
850 ///      `[u64; 10]`.
851 ///  - **tuple_struct**
852 ///    - A named tuple, for example `struct Rgb(u8, u8, u8)`.
853 ///  - **tuple_variant**
854 ///    - For example the `E::T` in `enum E { T(u8, u8) }`.
855 ///  - **map**
856 ///    - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.
857 ///  - **struct**
858 ///    - A heterogeneous key-value pairing in which the keys are strings and
859 ///      will be known at deserialization time without looking at the serialized
860 ///      data, for example `struct S { r: u8, g: u8, b: u8 }`.
861 ///  - **struct_variant**
862 ///    - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.
863 ///
864 /// The `Deserializer` trait supports two entry point styles which enables
865 /// different kinds of deserialization.
866 ///
867 /// 1. The `deserialize_any` method. Self-describing data formats like JSON are
868 ///    able to look at the serialized data and tell what it represents. For
869 ///    example the JSON deserializer may see an opening curly brace (`{`) and
870 ///    know that it is seeing a map. If the data format supports
871 ///    `Deserializer::deserialize_any`, it will drive the Visitor using whatever
872 ///    type it sees in the input. JSON uses this approach when deserializing
873 ///    `serde_json::Value` which is an enum that can represent any JSON
874 ///    document. Without knowing what is in a JSON document, we can deserialize
875 ///    it to `serde_json::Value` by going through
876 ///    `Deserializer::deserialize_any`.
877 ///
878 /// 2. The various `deserialize_*` methods. Non-self-describing formats like
879 ///    Postcard need to be told what is in the input in order to deserialize it.
880 ///    The `deserialize_*` methods are hints to the deserializer for how to
881 ///    interpret the next piece of input. Non-self-describing formats are not
882 ///    able to deserialize something like `serde_json::Value` which relies on
883 ///    `Deserializer::deserialize_any`.
884 ///
885 /// When implementing `Deserialize`, you should avoid relying on
886 /// `Deserializer::deserialize_any` unless you need to be told by the
887 /// Deserializer what type is in the input. Know that relying on
888 /// `Deserializer::deserialize_any` means your data type will be able to
889 /// deserialize from self-describing formats only, ruling out Postcard and many
890 /// others.
891 ///
892 /// [Serde data model]: https://serde.rs/data-model.html
893 ///
894 /// # Lifetime
895 ///
896 /// The `'de` lifetime of this trait is the lifetime of data that may be
897 /// borrowed from the input when deserializing. See the page [Understanding
898 /// deserializer lifetimes] for a more detailed explanation of these lifetimes.
899 ///
900 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
901 ///
902 /// # Example implementation
903 ///
904 /// The [example data format] presented on the website contains example code for
905 /// a basic JSON `Deserializer`.
906 ///
907 /// [example data format]: https://serde.rs/data-format.html
908 pub trait Deserializer<'de>: Sized {
909     /// The error type that can be returned if some error occurs during
910     /// deserialization.
911     type Error: Error;
912 
913     /// Require the `Deserializer` to figure out how to drive the visitor based
914     /// on what data type is in the input.
915     ///
916     /// When implementing `Deserialize`, you should avoid relying on
917     /// `Deserializer::deserialize_any` unless you need to be told by the
918     /// Deserializer what type is in the input. Know that relying on
919     /// `Deserializer::deserialize_any` means your data type will be able to
920     /// deserialize from self-describing formats only, ruling out Postcard and
921     /// many others.
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>922     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
923     where
924         V: Visitor<'de>;
925 
926     /// Hint that the `Deserialize` type is expecting a `bool` value.
deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>927     fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
928     where
929         V: Visitor<'de>;
930 
931     /// Hint that the `Deserialize` type is expecting an `i8` value.
deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>932     fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
933     where
934         V: Visitor<'de>;
935 
936     /// Hint that the `Deserialize` type is expecting an `i16` value.
deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>937     fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
938     where
939         V: Visitor<'de>;
940 
941     /// Hint that the `Deserialize` type is expecting an `i32` value.
deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>942     fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
943     where
944         V: Visitor<'de>;
945 
946     /// Hint that the `Deserialize` type is expecting an `i64` value.
deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>947     fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
948     where
949         V: Visitor<'de>;
950 
951     /// Hint that the `Deserialize` type is expecting an `i128` value.
952     ///
953     /// The default behavior unconditionally returns an error.
deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,954     fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
955     where
956         V: Visitor<'de>,
957     {
958         let _ = visitor;
959         Err(Error::custom("i128 is not supported"))
960     }
961 
962     /// Hint that the `Deserialize` type is expecting a `u8` value.
deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>963     fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
964     where
965         V: Visitor<'de>;
966 
967     /// Hint that the `Deserialize` type is expecting a `u16` value.
deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>968     fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
969     where
970         V: Visitor<'de>;
971 
972     /// Hint that the `Deserialize` type is expecting a `u32` value.
deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>973     fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
974     where
975         V: Visitor<'de>;
976 
977     /// Hint that the `Deserialize` type is expecting a `u64` value.
deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>978     fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
979     where
980         V: Visitor<'de>;
981 
982     /// Hint that the `Deserialize` type is expecting an `u128` value.
983     ///
984     /// The default behavior unconditionally returns an error.
deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,985     fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
986     where
987         V: Visitor<'de>,
988     {
989         let _ = visitor;
990         Err(Error::custom("u128 is not supported"))
991     }
992 
993     /// Hint that the `Deserialize` type is expecting a `f32` value.
deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>994     fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
995     where
996         V: Visitor<'de>;
997 
998     /// Hint that the `Deserialize` type is expecting a `f64` value.
deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>999     fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1000     where
1001         V: Visitor<'de>;
1002 
1003     /// Hint that the `Deserialize` type is expecting a `char` value.
deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1004     fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1005     where
1006         V: Visitor<'de>;
1007 
1008     /// Hint that the `Deserialize` type is expecting a string value and does
1009     /// not benefit from taking ownership of buffered data owned by the
1010     /// `Deserializer`.
1011     ///
1012     /// If the `Visitor` would benefit from taking ownership of `String` data,
1013     /// indicate this to the `Deserializer` by using `deserialize_string`
1014     /// instead.
deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1015     fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1016     where
1017         V: Visitor<'de>;
1018 
1019     /// Hint that the `Deserialize` type is expecting a string value and would
1020     /// benefit from taking ownership of buffered data owned by the
1021     /// `Deserializer`.
1022     ///
1023     /// If the `Visitor` would not benefit from taking ownership of `String`
1024     /// data, indicate that to the `Deserializer` by using `deserialize_str`
1025     /// instead.
deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1026     fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1027     where
1028         V: Visitor<'de>;
1029 
1030     /// Hint that the `Deserialize` type is expecting a byte array and does not
1031     /// benefit from taking ownership of buffered data owned by the
1032     /// `Deserializer`.
1033     ///
1034     /// If the `Visitor` would benefit from taking ownership of `Vec<u8>` data,
1035     /// indicate this to the `Deserializer` by using `deserialize_byte_buf`
1036     /// instead.
deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1037     fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1038     where
1039         V: Visitor<'de>;
1040 
1041     /// Hint that the `Deserialize` type is expecting a byte array and would
1042     /// benefit from taking ownership of buffered data owned by the
1043     /// `Deserializer`.
1044     ///
1045     /// If the `Visitor` would not benefit from taking ownership of `Vec<u8>`
1046     /// data, indicate that to the `Deserializer` by using `deserialize_bytes`
1047     /// instead.
deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1048     fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1049     where
1050         V: Visitor<'de>;
1051 
1052     /// Hint that the `Deserialize` type is expecting an optional value.
1053     ///
1054     /// This allows deserializers that encode an optional value as a nullable
1055     /// value to convert the null value into `None` and a regular value into
1056     /// `Some(value)`.
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1057     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1058     where
1059         V: Visitor<'de>;
1060 
1061     /// Hint that the `Deserialize` type is expecting a unit value.
deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1062     fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1063     where
1064         V: Visitor<'de>;
1065 
1066     /// Hint that the `Deserialize` type is expecting a unit struct with a
1067     /// particular name.
deserialize_unit_struct<V>( self, name: &'static str, visitor: V, ) -> Result<V::Value, Self::Error> where V: Visitor<'de>1068     fn deserialize_unit_struct<V>(
1069         self,
1070         name: &'static str,
1071         visitor: V,
1072     ) -> Result<V::Value, Self::Error>
1073     where
1074         V: Visitor<'de>;
1075 
1076     /// Hint that the `Deserialize` type is expecting a newtype struct with a
1077     /// particular name.
deserialize_newtype_struct<V>( self, name: &'static str, visitor: V, ) -> Result<V::Value, Self::Error> where V: Visitor<'de>1078     fn deserialize_newtype_struct<V>(
1079         self,
1080         name: &'static str,
1081         visitor: V,
1082     ) -> Result<V::Value, Self::Error>
1083     where
1084         V: Visitor<'de>;
1085 
1086     /// Hint that the `Deserialize` type is expecting a sequence of values.
deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1087     fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1088     where
1089         V: Visitor<'de>;
1090 
1091     /// Hint that the `Deserialize` type is expecting a sequence of values and
1092     /// knows how many values there are without looking at the serialized data.
deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1093     fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1094     where
1095         V: Visitor<'de>;
1096 
1097     /// Hint that the `Deserialize` type is expecting a tuple struct with a
1098     /// particular name and number of fields.
deserialize_tuple_struct<V>( self, name: &'static str, len: usize, visitor: V, ) -> Result<V::Value, Self::Error> where V: Visitor<'de>1099     fn deserialize_tuple_struct<V>(
1100         self,
1101         name: &'static str,
1102         len: usize,
1103         visitor: V,
1104     ) -> Result<V::Value, Self::Error>
1105     where
1106         V: Visitor<'de>;
1107 
1108     /// Hint that the `Deserialize` type is expecting a map of key-value pairs.
deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1109     fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1110     where
1111         V: Visitor<'de>;
1112 
1113     /// Hint that the `Deserialize` type is expecting a struct with a particular
1114     /// name and fields.
deserialize_struct<V>( self, name: &'static str, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: Visitor<'de>1115     fn deserialize_struct<V>(
1116         self,
1117         name: &'static str,
1118         fields: &'static [&'static str],
1119         visitor: V,
1120     ) -> Result<V::Value, Self::Error>
1121     where
1122         V: Visitor<'de>;
1123 
1124     /// Hint that the `Deserialize` type is expecting an enum value with a
1125     /// particular name and possible variants.
deserialize_enum<V>( self, name: &'static str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: Visitor<'de>1126     fn deserialize_enum<V>(
1127         self,
1128         name: &'static str,
1129         variants: &'static [&'static str],
1130         visitor: V,
1131     ) -> Result<V::Value, Self::Error>
1132     where
1133         V: Visitor<'de>;
1134 
1135     /// Hint that the `Deserialize` type is expecting the name of a struct
1136     /// field or the discriminant of an enum variant.
deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1137     fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1138     where
1139         V: Visitor<'de>;
1140 
1141     /// Hint that the `Deserialize` type needs to deserialize a value whose type
1142     /// doesn't matter because it is ignored.
1143     ///
1144     /// Deserializers for non-self-describing formats may not support this mode.
deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>1145     fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1146     where
1147         V: Visitor<'de>;
1148 
1149     /// Determine whether `Deserialize` implementations should expect to
1150     /// deserialize their human-readable form.
1151     ///
1152     /// Some types have a human-readable form that may be somewhat expensive to
1153     /// construct, as well as a binary form that is compact and efficient.
1154     /// Generally text-based formats like JSON and YAML will prefer to use the
1155     /// human-readable one and binary formats like Postcard will prefer the
1156     /// compact one.
1157     ///
1158     /// ```edition2021
1159     /// # use std::ops::Add;
1160     /// # use std::str::FromStr;
1161     /// #
1162     /// # struct Timestamp;
1163     /// #
1164     /// # impl Timestamp {
1165     /// #     const EPOCH: Timestamp = Timestamp;
1166     /// # }
1167     /// #
1168     /// # impl FromStr for Timestamp {
1169     /// #     type Err = String;
1170     /// #     fn from_str(_: &str) -> Result<Self, Self::Err> {
1171     /// #         unimplemented!()
1172     /// #     }
1173     /// # }
1174     /// #
1175     /// # struct Duration;
1176     /// #
1177     /// # impl Duration {
1178     /// #     fn seconds(_: u64) -> Self { unimplemented!() }
1179     /// # }
1180     /// #
1181     /// # impl Add<Duration> for Timestamp {
1182     /// #     type Output = Timestamp;
1183     /// #     fn add(self, _: Duration) -> Self::Output {
1184     /// #         unimplemented!()
1185     /// #     }
1186     /// # }
1187     /// #
1188     /// use serde::de::{self, Deserialize, Deserializer};
1189     ///
1190     /// impl<'de> Deserialize<'de> for Timestamp {
1191     ///     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1192     ///     where
1193     ///         D: Deserializer<'de>,
1194     ///     {
1195     ///         if deserializer.is_human_readable() {
1196     ///             // Deserialize from a human-readable string like "2015-05-15T17:01:00Z".
1197     ///             let s = String::deserialize(deserializer)?;
1198     ///             Timestamp::from_str(&s).map_err(de::Error::custom)
1199     ///         } else {
1200     ///             // Deserialize from a compact binary representation, seconds since
1201     ///             // the Unix epoch.
1202     ///             let n = u64::deserialize(deserializer)?;
1203     ///             Ok(Timestamp::EPOCH + Duration::seconds(n))
1204     ///         }
1205     ///     }
1206     /// }
1207     /// ```
1208     ///
1209     /// The default implementation of this method returns `true`. Data formats
1210     /// may override this to `false` to request a compact form for types that
1211     /// support one. Note that modifying this method to change a format from
1212     /// human-readable to compact or vice versa should be regarded as a breaking
1213     /// change, as a value serialized in human-readable mode is not required to
1214     /// deserialize from the same data in compact mode.
1215     #[inline]
is_human_readable(&self) -> bool1216     fn is_human_readable(&self) -> bool {
1217         true
1218     }
1219 
1220     // Not public API.
1221     #[cfg(all(not(no_serde_derive), any(feature = "std", feature = "alloc")))]
1222     #[doc(hidden)]
__deserialize_content<V>( self, _: crate::actually_private::T, visitor: V, ) -> Result<crate::__private::de::Content<'de>, Self::Error> where V: Visitor<'de, Value = crate::__private::de::Content<'de>>,1223     fn __deserialize_content<V>(
1224         self,
1225         _: crate::actually_private::T,
1226         visitor: V,
1227     ) -> Result<crate::__private::de::Content<'de>, Self::Error>
1228     where
1229         V: Visitor<'de, Value = crate::__private::de::Content<'de>>,
1230     {
1231         self.deserialize_any(visitor)
1232     }
1233 }
1234 
1235 ////////////////////////////////////////////////////////////////////////////////
1236 
1237 /// This trait represents a visitor that walks through a deserializer.
1238 ///
1239 /// # Lifetime
1240 ///
1241 /// The `'de` lifetime of this trait is the requirement for lifetime of data
1242 /// that may be borrowed by `Self::Value`. See the page [Understanding
1243 /// deserializer lifetimes] for a more detailed explanation of these lifetimes.
1244 ///
1245 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
1246 ///
1247 /// # Example
1248 ///
1249 /// ```edition2021
1250 /// # use serde::de::{self, Unexpected, Visitor};
1251 /// # use std::fmt;
1252 /// #
1253 /// /// A visitor that deserializes a long string - a string containing at least
1254 /// /// some minimum number of bytes.
1255 /// struct LongString {
1256 ///     min: usize,
1257 /// }
1258 ///
1259 /// impl<'de> Visitor<'de> for LongString {
1260 ///     type Value = String;
1261 ///
1262 ///     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1263 ///         write!(formatter, "a string containing at least {} bytes", self.min)
1264 ///     }
1265 ///
1266 ///     fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1267 ///     where
1268 ///         E: de::Error,
1269 ///     {
1270 ///         if s.len() >= self.min {
1271 ///             Ok(s.to_owned())
1272 ///         } else {
1273 ///             Err(de::Error::invalid_value(Unexpected::Str(s), &self))
1274 ///         }
1275 ///     }
1276 /// }
1277 /// ```
1278 pub trait Visitor<'de>: Sized {
1279     /// The value produced by this visitor.
1280     type Value;
1281 
1282     /// Format a message stating what data this Visitor expects to receive.
1283     ///
1284     /// This is used in error messages. The message should complete the sentence
1285     /// "This Visitor expects to receive ...", for example the message could be
1286     /// "an integer between 0 and 64". The message should not be capitalized and
1287     /// should not end with a period.
1288     ///
1289     /// ```edition2021
1290     /// # use std::fmt;
1291     /// #
1292     /// # struct S {
1293     /// #     max: usize,
1294     /// # }
1295     /// #
1296     /// # impl<'de> serde::de::Visitor<'de> for S {
1297     /// #     type Value = ();
1298     /// #
1299     /// fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1300     ///     write!(formatter, "an integer between 0 and {}", self.max)
1301     /// }
1302     /// # }
1303     /// ```
expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result1304     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result;
1305 
1306     /// The input contains a boolean.
1307     ///
1308     /// The default implementation fails with a type error.
visit_bool<E>(self, v: bool) -> Result<Self::Value, E> where E: Error,1309     fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
1310     where
1311         E: Error,
1312     {
1313         Err(Error::invalid_type(Unexpected::Bool(v), &self))
1314     }
1315 
1316     /// The input contains an `i8`.
1317     ///
1318     /// The default implementation forwards to [`visit_i64`].
1319     ///
1320     /// [`visit_i64`]: #method.visit_i64
visit_i8<E>(self, v: i8) -> Result<Self::Value, E> where E: Error,1321     fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
1322     where
1323         E: Error,
1324     {
1325         self.visit_i64(v as i64)
1326     }
1327 
1328     /// The input contains an `i16`.
1329     ///
1330     /// The default implementation forwards to [`visit_i64`].
1331     ///
1332     /// [`visit_i64`]: #method.visit_i64
visit_i16<E>(self, v: i16) -> Result<Self::Value, E> where E: Error,1333     fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
1334     where
1335         E: Error,
1336     {
1337         self.visit_i64(v as i64)
1338     }
1339 
1340     /// The input contains an `i32`.
1341     ///
1342     /// The default implementation forwards to [`visit_i64`].
1343     ///
1344     /// [`visit_i64`]: #method.visit_i64
visit_i32<E>(self, v: i32) -> Result<Self::Value, E> where E: Error,1345     fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
1346     where
1347         E: Error,
1348     {
1349         self.visit_i64(v as i64)
1350     }
1351 
1352     /// The input contains an `i64`.
1353     ///
1354     /// The default implementation fails with a type error.
visit_i64<E>(self, v: i64) -> Result<Self::Value, E> where E: Error,1355     fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
1356     where
1357         E: Error,
1358     {
1359         Err(Error::invalid_type(Unexpected::Signed(v), &self))
1360     }
1361 
1362     /// The input contains a `i128`.
1363     ///
1364     /// The default implementation fails with a type error.
visit_i128<E>(self, v: i128) -> Result<Self::Value, E> where E: Error,1365     fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
1366     where
1367         E: Error,
1368     {
1369         let mut buf = [0u8; 58];
1370         let mut writer = format::Buf::new(&mut buf);
1371         fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as i128", v)).unwrap();
1372         Err(Error::invalid_type(
1373             Unexpected::Other(writer.as_str()),
1374             &self,
1375         ))
1376     }
1377 
1378     /// The input contains a `u8`.
1379     ///
1380     /// The default implementation forwards to [`visit_u64`].
1381     ///
1382     /// [`visit_u64`]: #method.visit_u64
visit_u8<E>(self, v: u8) -> Result<Self::Value, E> where E: Error,1383     fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
1384     where
1385         E: Error,
1386     {
1387         self.visit_u64(v as u64)
1388     }
1389 
1390     /// The input contains a `u16`.
1391     ///
1392     /// The default implementation forwards to [`visit_u64`].
1393     ///
1394     /// [`visit_u64`]: #method.visit_u64
visit_u16<E>(self, v: u16) -> Result<Self::Value, E> where E: Error,1395     fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
1396     where
1397         E: Error,
1398     {
1399         self.visit_u64(v as u64)
1400     }
1401 
1402     /// The input contains a `u32`.
1403     ///
1404     /// The default implementation forwards to [`visit_u64`].
1405     ///
1406     /// [`visit_u64`]: #method.visit_u64
visit_u32<E>(self, v: u32) -> Result<Self::Value, E> where E: Error,1407     fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
1408     where
1409         E: Error,
1410     {
1411         self.visit_u64(v as u64)
1412     }
1413 
1414     /// The input contains a `u64`.
1415     ///
1416     /// The default implementation fails with a type error.
visit_u64<E>(self, v: u64) -> Result<Self::Value, E> where E: Error,1417     fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
1418     where
1419         E: Error,
1420     {
1421         Err(Error::invalid_type(Unexpected::Unsigned(v), &self))
1422     }
1423 
1424     /// The input contains a `u128`.
1425     ///
1426     /// The default implementation fails with a type error.
visit_u128<E>(self, v: u128) -> Result<Self::Value, E> where E: Error,1427     fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
1428     where
1429         E: Error,
1430     {
1431         let mut buf = [0u8; 57];
1432         let mut writer = format::Buf::new(&mut buf);
1433         fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as u128", v)).unwrap();
1434         Err(Error::invalid_type(
1435             Unexpected::Other(writer.as_str()),
1436             &self,
1437         ))
1438     }
1439 
1440     /// The input contains an `f32`.
1441     ///
1442     /// The default implementation forwards to [`visit_f64`].
1443     ///
1444     /// [`visit_f64`]: #method.visit_f64
visit_f32<E>(self, v: f32) -> Result<Self::Value, E> where E: Error,1445     fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
1446     where
1447         E: Error,
1448     {
1449         self.visit_f64(v as f64)
1450     }
1451 
1452     /// The input contains an `f64`.
1453     ///
1454     /// The default implementation fails with a type error.
visit_f64<E>(self, v: f64) -> Result<Self::Value, E> where E: Error,1455     fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
1456     where
1457         E: Error,
1458     {
1459         Err(Error::invalid_type(Unexpected::Float(v), &self))
1460     }
1461 
1462     /// The input contains a `char`.
1463     ///
1464     /// The default implementation forwards to [`visit_str`] as a one-character
1465     /// string.
1466     ///
1467     /// [`visit_str`]: #method.visit_str
1468     #[inline]
visit_char<E>(self, v: char) -> Result<Self::Value, E> where E: Error,1469     fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
1470     where
1471         E: Error,
1472     {
1473         self.visit_str(v.encode_utf8(&mut [0u8; 4]))
1474     }
1475 
1476     /// The input contains a string. The lifetime of the string is ephemeral and
1477     /// it may be destroyed after this method returns.
1478     ///
1479     /// This method allows the `Deserializer` to avoid a copy by retaining
1480     /// ownership of any buffered data. `Deserialize` implementations that do
1481     /// not benefit from taking ownership of `String` data should indicate that
1482     /// to the deserializer by using `Deserializer::deserialize_str` rather than
1483     /// `Deserializer::deserialize_string`.
1484     ///
1485     /// It is never correct to implement `visit_string` without implementing
1486     /// `visit_str`. Implement neither, both, or just `visit_str`.
visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: Error,1487     fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
1488     where
1489         E: Error,
1490     {
1491         Err(Error::invalid_type(Unexpected::Str(v), &self))
1492     }
1493 
1494     /// The input contains a string that lives at least as long as the
1495     /// `Deserializer`.
1496     ///
1497     /// This enables zero-copy deserialization of strings in some formats. For
1498     /// example JSON input containing the JSON string `"borrowed"` can be
1499     /// deserialized with zero copying into a `&'a str` as long as the input
1500     /// data outlives `'a`.
1501     ///
1502     /// The default implementation forwards to `visit_str`.
1503     #[inline]
visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E> where E: Error,1504     fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
1505     where
1506         E: Error,
1507     {
1508         self.visit_str(v)
1509     }
1510 
1511     /// The input contains a string and ownership of the string is being given
1512     /// to the `Visitor`.
1513     ///
1514     /// This method allows the `Visitor` to avoid a copy by taking ownership of
1515     /// a string created by the `Deserializer`. `Deserialize` implementations
1516     /// that benefit from taking ownership of `String` data should indicate that
1517     /// to the deserializer by using `Deserializer::deserialize_string` rather
1518     /// than `Deserializer::deserialize_str`, although not every deserializer
1519     /// will honor such a request.
1520     ///
1521     /// It is never correct to implement `visit_string` without implementing
1522     /// `visit_str`. Implement neither, both, or just `visit_str`.
1523     ///
1524     /// The default implementation forwards to `visit_str` and then drops the
1525     /// `String`.
1526     #[inline]
1527     #[cfg(any(feature = "std", feature = "alloc"))]
1528     #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))]
visit_string<E>(self, v: String) -> Result<Self::Value, E> where E: Error,1529     fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
1530     where
1531         E: Error,
1532     {
1533         self.visit_str(&v)
1534     }
1535 
1536     /// The input contains a byte array. The lifetime of the byte array is
1537     /// ephemeral and it may be destroyed after this method returns.
1538     ///
1539     /// This method allows the `Deserializer` to avoid a copy by retaining
1540     /// ownership of any buffered data. `Deserialize` implementations that do
1541     /// not benefit from taking ownership of `Vec<u8>` data should indicate that
1542     /// to the deserializer by using `Deserializer::deserialize_bytes` rather
1543     /// than `Deserializer::deserialize_byte_buf`.
1544     ///
1545     /// It is never correct to implement `visit_byte_buf` without implementing
1546     /// `visit_bytes`. Implement neither, both, or just `visit_bytes`.
visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> where E: Error,1547     fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
1548     where
1549         E: Error,
1550     {
1551         Err(Error::invalid_type(Unexpected::Bytes(v), &self))
1552     }
1553 
1554     /// The input contains a byte array that lives at least as long as the
1555     /// `Deserializer`.
1556     ///
1557     /// This enables zero-copy deserialization of bytes in some formats. For
1558     /// example Postcard data containing bytes can be deserialized with zero
1559     /// copying into a `&'a [u8]` as long as the input data outlives `'a`.
1560     ///
1561     /// The default implementation forwards to `visit_bytes`.
1562     #[inline]
visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E> where E: Error,1563     fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
1564     where
1565         E: Error,
1566     {
1567         self.visit_bytes(v)
1568     }
1569 
1570     /// The input contains a byte array and ownership of the byte array is being
1571     /// given to the `Visitor`.
1572     ///
1573     /// This method allows the `Visitor` to avoid a copy by taking ownership of
1574     /// a byte buffer created by the `Deserializer`. `Deserialize`
1575     /// implementations that benefit from taking ownership of `Vec<u8>` data
1576     /// should indicate that to the deserializer by using
1577     /// `Deserializer::deserialize_byte_buf` rather than
1578     /// `Deserializer::deserialize_bytes`, although not every deserializer will
1579     /// honor such a request.
1580     ///
1581     /// It is never correct to implement `visit_byte_buf` without implementing
1582     /// `visit_bytes`. Implement neither, both, or just `visit_bytes`.
1583     ///
1584     /// The default implementation forwards to `visit_bytes` and then drops the
1585     /// `Vec<u8>`.
1586     #[cfg(any(feature = "std", feature = "alloc"))]
1587     #[cfg_attr(doc_cfg, doc(cfg(any(feature = "std", feature = "alloc"))))]
visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> where E: Error,1588     fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
1589     where
1590         E: Error,
1591     {
1592         self.visit_bytes(&v)
1593     }
1594 
1595     /// The input contains an optional that is absent.
1596     ///
1597     /// The default implementation fails with a type error.
visit_none<E>(self) -> Result<Self::Value, E> where E: Error,1598     fn visit_none<E>(self) -> Result<Self::Value, E>
1599     where
1600         E: Error,
1601     {
1602         Err(Error::invalid_type(Unexpected::Option, &self))
1603     }
1604 
1605     /// The input contains an optional that is present.
1606     ///
1607     /// The default implementation fails with a type error.
visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,1608     fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1609     where
1610         D: Deserializer<'de>,
1611     {
1612         let _ = deserializer;
1613         Err(Error::invalid_type(Unexpected::Option, &self))
1614     }
1615 
1616     /// The input contains a unit `()`.
1617     ///
1618     /// The default implementation fails with a type error.
visit_unit<E>(self) -> Result<Self::Value, E> where E: Error,1619     fn visit_unit<E>(self) -> Result<Self::Value, E>
1620     where
1621         E: Error,
1622     {
1623         Err(Error::invalid_type(Unexpected::Unit, &self))
1624     }
1625 
1626     /// The input contains a newtype struct.
1627     ///
1628     /// The content of the newtype struct may be read from the given
1629     /// `Deserializer`.
1630     ///
1631     /// The default implementation fails with a type error.
visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,1632     fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1633     where
1634         D: Deserializer<'de>,
1635     {
1636         let _ = deserializer;
1637         Err(Error::invalid_type(Unexpected::NewtypeStruct, &self))
1638     }
1639 
1640     /// The input contains a sequence of elements.
1641     ///
1642     /// The default implementation fails with a type error.
visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error> where A: SeqAccess<'de>,1643     fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
1644     where
1645         A: SeqAccess<'de>,
1646     {
1647         let _ = seq;
1648         Err(Error::invalid_type(Unexpected::Seq, &self))
1649     }
1650 
1651     /// The input contains a key-value map.
1652     ///
1653     /// The default implementation fails with a type error.
visit_map<A>(self, map: A) -> Result<Self::Value, A::Error> where A: MapAccess<'de>,1654     fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
1655     where
1656         A: MapAccess<'de>,
1657     {
1658         let _ = map;
1659         Err(Error::invalid_type(Unexpected::Map, &self))
1660     }
1661 
1662     /// The input contains an enum.
1663     ///
1664     /// The default implementation fails with a type error.
visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error> where A: EnumAccess<'de>,1665     fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
1666     where
1667         A: EnumAccess<'de>,
1668     {
1669         let _ = data;
1670         Err(Error::invalid_type(Unexpected::Enum, &self))
1671     }
1672 
1673     // Used when deserializing a flattened Option field. Not public API.
1674     #[doc(hidden)]
__private_visit_untagged_option<D>(self, _: D) -> Result<Self::Value, ()> where D: Deserializer<'de>,1675     fn __private_visit_untagged_option<D>(self, _: D) -> Result<Self::Value, ()>
1676     where
1677         D: Deserializer<'de>,
1678     {
1679         Err(())
1680     }
1681 }
1682 
1683 ////////////////////////////////////////////////////////////////////////////////
1684 
1685 /// Provides a `Visitor` access to each element of a sequence in the input.
1686 ///
1687 /// This is a trait that a `Deserializer` passes to a `Visitor` implementation,
1688 /// which deserializes each item in a sequence.
1689 ///
1690 /// # Lifetime
1691 ///
1692 /// The `'de` lifetime of this trait is the lifetime of data that may be
1693 /// borrowed by deserialized sequence elements. See the page [Understanding
1694 /// deserializer lifetimes] for a more detailed explanation of these lifetimes.
1695 ///
1696 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
1697 ///
1698 /// # Example implementation
1699 ///
1700 /// The [example data format] presented on the website demonstrates an
1701 /// implementation of `SeqAccess` for a basic JSON data format.
1702 ///
1703 /// [example data format]: https://serde.rs/data-format.html
1704 pub trait SeqAccess<'de> {
1705     /// The error type that can be returned if some error occurs during
1706     /// deserialization.
1707     type Error: Error;
1708 
1709     /// This returns `Ok(Some(value))` for the next value in the sequence, or
1710     /// `Ok(None)` if there are no more remaining items.
1711     ///
1712     /// `Deserialize` implementations should typically use
1713     /// `SeqAccess::next_element` instead.
next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: DeserializeSeed<'de>1714     fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1715     where
1716         T: DeserializeSeed<'de>;
1717 
1718     /// This returns `Ok(Some(value))` for the next value in the sequence, or
1719     /// `Ok(None)` if there are no more remaining items.
1720     ///
1721     /// This method exists as a convenience for `Deserialize` implementations.
1722     /// `SeqAccess` implementations should not override the default behavior.
1723     #[inline]
next_element<T>(&mut self) -> Result<Option<T>, Self::Error> where T: Deserialize<'de>,1724     fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
1725     where
1726         T: Deserialize<'de>,
1727     {
1728         self.next_element_seed(PhantomData)
1729     }
1730 
1731     /// Returns the number of elements remaining in the sequence, if known.
1732     #[inline]
size_hint(&self) -> Option<usize>1733     fn size_hint(&self) -> Option<usize> {
1734         None
1735     }
1736 }
1737 
1738 impl<'de, 'a, A: ?Sized> SeqAccess<'de> for &'a mut A
1739 where
1740     A: SeqAccess<'de>,
1741 {
1742     type Error = A::Error;
1743 
1744     #[inline]
next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: DeserializeSeed<'de>,1745     fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1746     where
1747         T: DeserializeSeed<'de>,
1748     {
1749         (**self).next_element_seed(seed)
1750     }
1751 
1752     #[inline]
next_element<T>(&mut self) -> Result<Option<T>, Self::Error> where T: Deserialize<'de>,1753     fn next_element<T>(&mut self) -> Result<Option<T>, Self::Error>
1754     where
1755         T: Deserialize<'de>,
1756     {
1757         (**self).next_element()
1758     }
1759 
1760     #[inline]
size_hint(&self) -> Option<usize>1761     fn size_hint(&self) -> Option<usize> {
1762         (**self).size_hint()
1763     }
1764 }
1765 
1766 ////////////////////////////////////////////////////////////////////////////////
1767 
1768 /// Provides a `Visitor` access to each entry of a map in the input.
1769 ///
1770 /// This is a trait that a `Deserializer` passes to a `Visitor` implementation.
1771 ///
1772 /// # Lifetime
1773 ///
1774 /// The `'de` lifetime of this trait is the lifetime of data that may be
1775 /// borrowed by deserialized map entries. See the page [Understanding
1776 /// deserializer lifetimes] for a more detailed explanation of these lifetimes.
1777 ///
1778 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
1779 ///
1780 /// # Example implementation
1781 ///
1782 /// The [example data format] presented on the website demonstrates an
1783 /// implementation of `MapAccess` for a basic JSON data format.
1784 ///
1785 /// [example data format]: https://serde.rs/data-format.html
1786 pub trait MapAccess<'de> {
1787     /// The error type that can be returned if some error occurs during
1788     /// deserialization.
1789     type Error: Error;
1790 
1791     /// This returns `Ok(Some(key))` for the next key in the map, or `Ok(None)`
1792     /// if there are no more remaining entries.
1793     ///
1794     /// `Deserialize` implementations should typically use
1795     /// `MapAccess::next_key` or `MapAccess::next_entry` instead.
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error> where K: DeserializeSeed<'de>1796     fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
1797     where
1798         K: DeserializeSeed<'de>;
1799 
1800     /// This returns a `Ok(value)` for the next value in the map.
1801     ///
1802     /// `Deserialize` implementations should typically use
1803     /// `MapAccess::next_value` instead.
1804     ///
1805     /// # Panics
1806     ///
1807     /// Calling `next_value_seed` before `next_key_seed` is incorrect and is
1808     /// allowed to panic or return bogus results.
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error> where V: DeserializeSeed<'de>1809     fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
1810     where
1811         V: DeserializeSeed<'de>;
1812 
1813     /// This returns `Ok(Some((key, value)))` for the next (key-value) pair in
1814     /// the map, or `Ok(None)` if there are no more remaining items.
1815     ///
1816     /// `MapAccess` implementations should override the default behavior if a
1817     /// more efficient implementation is possible.
1818     ///
1819     /// `Deserialize` implementations should typically use
1820     /// `MapAccess::next_entry` instead.
1821     #[inline]
next_entry_seed<K, V>( &mut self, kseed: K, vseed: V, ) -> Result<Option<(K::Value, V::Value)>, Self::Error> where K: DeserializeSeed<'de>, V: DeserializeSeed<'de>,1822     fn next_entry_seed<K, V>(
1823         &mut self,
1824         kseed: K,
1825         vseed: V,
1826     ) -> Result<Option<(K::Value, V::Value)>, Self::Error>
1827     where
1828         K: DeserializeSeed<'de>,
1829         V: DeserializeSeed<'de>,
1830     {
1831         match tri!(self.next_key_seed(kseed)) {
1832             Some(key) => {
1833                 let value = tri!(self.next_value_seed(vseed));
1834                 Ok(Some((key, value)))
1835             }
1836             None => Ok(None),
1837         }
1838     }
1839 
1840     /// This returns `Ok(Some(key))` for the next key in the map, or `Ok(None)`
1841     /// if there are no more remaining entries.
1842     ///
1843     /// This method exists as a convenience for `Deserialize` implementations.
1844     /// `MapAccess` implementations should not override the default behavior.
1845     #[inline]
next_key<K>(&mut self) -> Result<Option<K>, Self::Error> where K: Deserialize<'de>,1846     fn next_key<K>(&mut self) -> Result<Option<K>, Self::Error>
1847     where
1848         K: Deserialize<'de>,
1849     {
1850         self.next_key_seed(PhantomData)
1851     }
1852 
1853     /// This returns a `Ok(value)` for the next value in the map.
1854     ///
1855     /// This method exists as a convenience for `Deserialize` implementations.
1856     /// `MapAccess` implementations should not override the default behavior.
1857     ///
1858     /// # Panics
1859     ///
1860     /// Calling `next_value` before `next_key` is incorrect and is allowed to
1861     /// panic or return bogus results.
1862     #[inline]
next_value<V>(&mut self) -> Result<V, Self::Error> where V: Deserialize<'de>,1863     fn next_value<V>(&mut self) -> Result<V, Self::Error>
1864     where
1865         V: Deserialize<'de>,
1866     {
1867         self.next_value_seed(PhantomData)
1868     }
1869 
1870     /// This returns `Ok(Some((key, value)))` for the next (key-value) pair in
1871     /// the map, or `Ok(None)` if there are no more remaining items.
1872     ///
1873     /// This method exists as a convenience for `Deserialize` implementations.
1874     /// `MapAccess` implementations should not override the default behavior.
1875     #[inline]
next_entry<K, V>(&mut self) -> Result<Option<(K, V)>, Self::Error> where K: Deserialize<'de>, V: Deserialize<'de>,1876     fn next_entry<K, V>(&mut self) -> Result<Option<(K, V)>, Self::Error>
1877     where
1878         K: Deserialize<'de>,
1879         V: Deserialize<'de>,
1880     {
1881         self.next_entry_seed(PhantomData, PhantomData)
1882     }
1883 
1884     /// Returns the number of entries remaining in the map, if known.
1885     #[inline]
size_hint(&self) -> Option<usize>1886     fn size_hint(&self) -> Option<usize> {
1887         None
1888     }
1889 }
1890 
1891 impl<'de, 'a, A: ?Sized> MapAccess<'de> for &'a mut A
1892 where
1893     A: MapAccess<'de>,
1894 {
1895     type Error = A::Error;
1896 
1897     #[inline]
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error> where K: DeserializeSeed<'de>,1898     fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
1899     where
1900         K: DeserializeSeed<'de>,
1901     {
1902         (**self).next_key_seed(seed)
1903     }
1904 
1905     #[inline]
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error> where V: DeserializeSeed<'de>,1906     fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
1907     where
1908         V: DeserializeSeed<'de>,
1909     {
1910         (**self).next_value_seed(seed)
1911     }
1912 
1913     #[inline]
next_entry_seed<K, V>( &mut self, kseed: K, vseed: V, ) -> Result<Option<(K::Value, V::Value)>, Self::Error> where K: DeserializeSeed<'de>, V: DeserializeSeed<'de>,1914     fn next_entry_seed<K, V>(
1915         &mut self,
1916         kseed: K,
1917         vseed: V,
1918     ) -> Result<Option<(K::Value, V::Value)>, Self::Error>
1919     where
1920         K: DeserializeSeed<'de>,
1921         V: DeserializeSeed<'de>,
1922     {
1923         (**self).next_entry_seed(kseed, vseed)
1924     }
1925 
1926     #[inline]
next_entry<K, V>(&mut self) -> Result<Option<(K, V)>, Self::Error> where K: Deserialize<'de>, V: Deserialize<'de>,1927     fn next_entry<K, V>(&mut self) -> Result<Option<(K, V)>, Self::Error>
1928     where
1929         K: Deserialize<'de>,
1930         V: Deserialize<'de>,
1931     {
1932         (**self).next_entry()
1933     }
1934 
1935     #[inline]
next_key<K>(&mut self) -> Result<Option<K>, Self::Error> where K: Deserialize<'de>,1936     fn next_key<K>(&mut self) -> Result<Option<K>, Self::Error>
1937     where
1938         K: Deserialize<'de>,
1939     {
1940         (**self).next_key()
1941     }
1942 
1943     #[inline]
next_value<V>(&mut self) -> Result<V, Self::Error> where V: Deserialize<'de>,1944     fn next_value<V>(&mut self) -> Result<V, Self::Error>
1945     where
1946         V: Deserialize<'de>,
1947     {
1948         (**self).next_value()
1949     }
1950 
1951     #[inline]
size_hint(&self) -> Option<usize>1952     fn size_hint(&self) -> Option<usize> {
1953         (**self).size_hint()
1954     }
1955 }
1956 
1957 ////////////////////////////////////////////////////////////////////////////////
1958 
1959 /// Provides a `Visitor` access to the data of an enum in the input.
1960 ///
1961 /// `EnumAccess` is created by the `Deserializer` and passed to the
1962 /// `Visitor` in order to identify which variant of an enum to deserialize.
1963 ///
1964 /// # Lifetime
1965 ///
1966 /// The `'de` lifetime of this trait is the lifetime of data that may be
1967 /// borrowed by the deserialized enum variant. See the page [Understanding
1968 /// deserializer lifetimes] for a more detailed explanation of these lifetimes.
1969 ///
1970 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
1971 ///
1972 /// # Example implementation
1973 ///
1974 /// The [example data format] presented on the website demonstrates an
1975 /// implementation of `EnumAccess` for a basic JSON data format.
1976 ///
1977 /// [example data format]: https://serde.rs/data-format.html
1978 pub trait EnumAccess<'de>: Sized {
1979     /// The error type that can be returned if some error occurs during
1980     /// deserialization.
1981     type Error: Error;
1982     /// The `Visitor` that will be used to deserialize the content of the enum
1983     /// variant.
1984     type Variant: VariantAccess<'de, Error = Self::Error>;
1985 
1986     /// `variant` is called to identify which variant to deserialize.
1987     ///
1988     /// `Deserialize` implementations should typically use `EnumAccess::variant`
1989     /// instead.
variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: DeserializeSeed<'de>1990     fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
1991     where
1992         V: DeserializeSeed<'de>;
1993 
1994     /// `variant` is called to identify which variant to deserialize.
1995     ///
1996     /// This method exists as a convenience for `Deserialize` implementations.
1997     /// `EnumAccess` implementations should not override the default behavior.
1998     #[inline]
variant<V>(self) -> Result<(V, Self::Variant), Self::Error> where V: Deserialize<'de>,1999     fn variant<V>(self) -> Result<(V, Self::Variant), Self::Error>
2000     where
2001         V: Deserialize<'de>,
2002     {
2003         self.variant_seed(PhantomData)
2004     }
2005 }
2006 
2007 /// `VariantAccess` is a visitor that is created by the `Deserializer` and
2008 /// passed to the `Deserialize` to deserialize the content of a particular enum
2009 /// variant.
2010 ///
2011 /// # Lifetime
2012 ///
2013 /// The `'de` lifetime of this trait is the lifetime of data that may be
2014 /// borrowed by the deserialized enum variant. See the page [Understanding
2015 /// deserializer lifetimes] for a more detailed explanation of these lifetimes.
2016 ///
2017 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
2018 ///
2019 /// # Example implementation
2020 ///
2021 /// The [example data format] presented on the website demonstrates an
2022 /// implementation of `VariantAccess` for a basic JSON data format.
2023 ///
2024 /// [example data format]: https://serde.rs/data-format.html
2025 pub trait VariantAccess<'de>: Sized {
2026     /// The error type that can be returned if some error occurs during
2027     /// deserialization. Must match the error type of our `EnumAccess`.
2028     type Error: Error;
2029 
2030     /// Called when deserializing a variant with no values.
2031     ///
2032     /// If the data contains a different type of variant, the following
2033     /// `invalid_type` error should be constructed:
2034     ///
2035     /// ```edition2021
2036     /// # use serde::de::{self, value, DeserializeSeed, Visitor, VariantAccess, Unexpected};
2037     /// #
2038     /// # struct X;
2039     /// #
2040     /// # impl<'de> VariantAccess<'de> for X {
2041     /// #     type Error = value::Error;
2042     /// #
2043     /// fn unit_variant(self) -> Result<(), Self::Error> {
2044     ///     // What the data actually contained; suppose it is a tuple variant.
2045     ///     let unexp = Unexpected::TupleVariant;
2046     ///     Err(de::Error::invalid_type(unexp, &"unit variant"))
2047     /// }
2048     /// #
2049     /// #     fn newtype_variant_seed<T>(self, _: T) -> Result<T::Value, Self::Error>
2050     /// #     where
2051     /// #         T: DeserializeSeed<'de>,
2052     /// #     { unimplemented!() }
2053     /// #
2054     /// #     fn tuple_variant<V>(self, _: usize, _: V) -> Result<V::Value, Self::Error>
2055     /// #     where
2056     /// #         V: Visitor<'de>,
2057     /// #     { unimplemented!() }
2058     /// #
2059     /// #     fn struct_variant<V>(self, _: &[&str], _: V) -> Result<V::Value, Self::Error>
2060     /// #     where
2061     /// #         V: Visitor<'de>,
2062     /// #     { unimplemented!() }
2063     /// # }
2064     /// ```
unit_variant(self) -> Result<(), Self::Error>2065     fn unit_variant(self) -> Result<(), Self::Error>;
2066 
2067     /// Called when deserializing a variant with a single value.
2068     ///
2069     /// `Deserialize` implementations should typically use
2070     /// `VariantAccess::newtype_variant` instead.
2071     ///
2072     /// If the data contains a different type of variant, the following
2073     /// `invalid_type` error should be constructed:
2074     ///
2075     /// ```edition2021
2076     /// # use serde::de::{self, value, DeserializeSeed, Visitor, VariantAccess, Unexpected};
2077     /// #
2078     /// # struct X;
2079     /// #
2080     /// # impl<'de> VariantAccess<'de> for X {
2081     /// #     type Error = value::Error;
2082     /// #
2083     /// #     fn unit_variant(self) -> Result<(), Self::Error> {
2084     /// #         unimplemented!()
2085     /// #     }
2086     /// #
2087     /// fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error>
2088     /// where
2089     ///     T: DeserializeSeed<'de>,
2090     /// {
2091     ///     // What the data actually contained; suppose it is a unit variant.
2092     ///     let unexp = Unexpected::UnitVariant;
2093     ///     Err(de::Error::invalid_type(unexp, &"newtype variant"))
2094     /// }
2095     /// #
2096     /// #     fn tuple_variant<V>(self, _: usize, _: V) -> Result<V::Value, Self::Error>
2097     /// #     where
2098     /// #         V: Visitor<'de>,
2099     /// #     { unimplemented!() }
2100     /// #
2101     /// #     fn struct_variant<V>(self, _: &[&str], _: V) -> Result<V::Value, Self::Error>
2102     /// #     where
2103     /// #         V: Visitor<'de>,
2104     /// #     { unimplemented!() }
2105     /// # }
2106     /// ```
newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error> where T: DeserializeSeed<'de>2107     fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
2108     where
2109         T: DeserializeSeed<'de>;
2110 
2111     /// Called when deserializing a variant with a single value.
2112     ///
2113     /// This method exists as a convenience for `Deserialize` implementations.
2114     /// `VariantAccess` implementations should not override the default
2115     /// behavior.
2116     #[inline]
newtype_variant<T>(self) -> Result<T, Self::Error> where T: Deserialize<'de>,2117     fn newtype_variant<T>(self) -> Result<T, Self::Error>
2118     where
2119         T: Deserialize<'de>,
2120     {
2121         self.newtype_variant_seed(PhantomData)
2122     }
2123 
2124     /// Called when deserializing a tuple-like variant.
2125     ///
2126     /// The `len` is the number of fields expected in the tuple variant.
2127     ///
2128     /// If the data contains a different type of variant, the following
2129     /// `invalid_type` error should be constructed:
2130     ///
2131     /// ```edition2021
2132     /// # use serde::de::{self, value, DeserializeSeed, Visitor, VariantAccess, Unexpected};
2133     /// #
2134     /// # struct X;
2135     /// #
2136     /// # impl<'de> VariantAccess<'de> for X {
2137     /// #     type Error = value::Error;
2138     /// #
2139     /// #     fn unit_variant(self) -> Result<(), Self::Error> {
2140     /// #         unimplemented!()
2141     /// #     }
2142     /// #
2143     /// #     fn newtype_variant_seed<T>(self, _: T) -> Result<T::Value, Self::Error>
2144     /// #     where
2145     /// #         T: DeserializeSeed<'de>,
2146     /// #     { unimplemented!() }
2147     /// #
2148     /// fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error>
2149     /// where
2150     ///     V: Visitor<'de>,
2151     /// {
2152     ///     // What the data actually contained; suppose it is a unit variant.
2153     ///     let unexp = Unexpected::UnitVariant;
2154     ///     Err(de::Error::invalid_type(unexp, &"tuple variant"))
2155     /// }
2156     /// #
2157     /// #     fn struct_variant<V>(self, _: &[&str], _: V) -> Result<V::Value, Self::Error>
2158     /// #     where
2159     /// #         V: Visitor<'de>,
2160     /// #     { unimplemented!() }
2161     /// # }
2162     /// ```
tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>2163     fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
2164     where
2165         V: Visitor<'de>;
2166 
2167     /// Called when deserializing a struct-like variant.
2168     ///
2169     /// The `fields` are the names of the fields of the struct variant.
2170     ///
2171     /// If the data contains a different type of variant, the following
2172     /// `invalid_type` error should be constructed:
2173     ///
2174     /// ```edition2021
2175     /// # use serde::de::{self, value, DeserializeSeed, Visitor, VariantAccess, Unexpected};
2176     /// #
2177     /// # struct X;
2178     /// #
2179     /// # impl<'de> VariantAccess<'de> for X {
2180     /// #     type Error = value::Error;
2181     /// #
2182     /// #     fn unit_variant(self) -> Result<(), Self::Error> {
2183     /// #         unimplemented!()
2184     /// #     }
2185     /// #
2186     /// #     fn newtype_variant_seed<T>(self, _: T) -> Result<T::Value, Self::Error>
2187     /// #     where
2188     /// #         T: DeserializeSeed<'de>,
2189     /// #     { unimplemented!() }
2190     /// #
2191     /// #     fn tuple_variant<V>(self, _: usize, _: V) -> Result<V::Value, Self::Error>
2192     /// #     where
2193     /// #         V: Visitor<'de>,
2194     /// #     { unimplemented!() }
2195     /// #
2196     /// fn struct_variant<V>(
2197     ///     self,
2198     ///     _fields: &'static [&'static str],
2199     ///     _visitor: V,
2200     /// ) -> Result<V::Value, Self::Error>
2201     /// where
2202     ///     V: Visitor<'de>,
2203     /// {
2204     ///     // What the data actually contained; suppose it is a unit variant.
2205     ///     let unexp = Unexpected::UnitVariant;
2206     ///     Err(de::Error::invalid_type(unexp, &"struct variant"))
2207     /// }
2208     /// # }
2209     /// ```
struct_variant<V>( self, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: Visitor<'de>2210     fn struct_variant<V>(
2211         self,
2212         fields: &'static [&'static str],
2213         visitor: V,
2214     ) -> Result<V::Value, Self::Error>
2215     where
2216         V: Visitor<'de>;
2217 }
2218 
2219 ////////////////////////////////////////////////////////////////////////////////
2220 
2221 /// Converts an existing value into a `Deserializer` from which other values can
2222 /// be deserialized.
2223 ///
2224 /// # Lifetime
2225 ///
2226 /// The `'de` lifetime of this trait is the lifetime of data that may be
2227 /// borrowed from the resulting `Deserializer`. See the page [Understanding
2228 /// deserializer lifetimes] for a more detailed explanation of these lifetimes.
2229 ///
2230 /// [Understanding deserializer lifetimes]: https://serde.rs/lifetimes.html
2231 ///
2232 /// # Example
2233 ///
2234 /// ```edition2021
2235 /// use serde::de::{value, Deserialize, IntoDeserializer};
2236 /// use serde_derive::Deserialize;
2237 /// use std::str::FromStr;
2238 ///
2239 /// #[derive(Deserialize)]
2240 /// enum Setting {
2241 ///     On,
2242 ///     Off,
2243 /// }
2244 ///
2245 /// impl FromStr for Setting {
2246 ///     type Err = value::Error;
2247 ///
2248 ///     fn from_str(s: &str) -> Result<Self, Self::Err> {
2249 ///         Self::deserialize(s.into_deserializer())
2250 ///     }
2251 /// }
2252 /// ```
2253 pub trait IntoDeserializer<'de, E: Error = value::Error> {
2254     /// The type of the deserializer being converted into.
2255     type Deserializer: Deserializer<'de, Error = E>;
2256 
2257     /// Convert this value into a deserializer.
into_deserializer(self) -> Self::Deserializer2258     fn into_deserializer(self) -> Self::Deserializer;
2259 }
2260 
2261 ////////////////////////////////////////////////////////////////////////////////
2262 
2263 /// Used in error messages.
2264 ///
2265 /// - expected `a`
2266 /// - expected `a` or `b`
2267 /// - expected one of `a`, `b`, `c`
2268 ///
2269 /// The slice of names must not be empty.
2270 struct OneOf {
2271     names: &'static [&'static str],
2272 }
2273 
2274 impl Display for OneOf {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result2275     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2276         match self.names.len() {
2277             0 => panic!(), // special case elsewhere
2278             1 => write!(formatter, "`{}`", self.names[0]),
2279             2 => write!(formatter, "`{}` or `{}`", self.names[0], self.names[1]),
2280             _ => {
2281                 tri!(formatter.write_str("one of "));
2282                 for (i, alt) in self.names.iter().enumerate() {
2283                     if i > 0 {
2284                         tri!(formatter.write_str(", "));
2285                     }
2286                     tri!(write!(formatter, "`{}`", alt));
2287                 }
2288                 Ok(())
2289             }
2290         }
2291     }
2292 }
2293 
2294 struct WithDecimalPoint(f64);
2295 
2296 impl Display for WithDecimalPoint {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result2297     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2298         struct LookForDecimalPoint<'f, 'a> {
2299             formatter: &'f mut fmt::Formatter<'a>,
2300             has_decimal_point: bool,
2301         }
2302 
2303         impl<'f, 'a> fmt::Write for LookForDecimalPoint<'f, 'a> {
2304             fn write_str(&mut self, fragment: &str) -> fmt::Result {
2305                 self.has_decimal_point |= fragment.contains('.');
2306                 self.formatter.write_str(fragment)
2307             }
2308 
2309             fn write_char(&mut self, ch: char) -> fmt::Result {
2310                 self.has_decimal_point |= ch == '.';
2311                 self.formatter.write_char(ch)
2312             }
2313         }
2314 
2315         let mut writer = LookForDecimalPoint {
2316             formatter,
2317             has_decimal_point: false,
2318         };
2319         tri!(write!(writer, "{}", self.0));
2320         if !writer.has_decimal_point {
2321             tri!(formatter.write_str(".0"));
2322         }
2323         Ok(())
2324     }
2325 }
2326