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\> *(if* features = \["rc"\] *is enabled)* 68 //! - Arc\<T\> *(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