1 //! Building blocks for deserializing basic values using the `IntoDeserializer` 2 //! trait. 3 //! 4 //! ```edition2018 5 //! use std::str::FromStr; 6 //! use serde::Deserialize; 7 //! use serde::de::{value, IntoDeserializer}; 8 //! 9 //! #[derive(Deserialize)] 10 //! enum Setting { 11 //! On, 12 //! Off, 13 //! } 14 //! 15 //! impl FromStr for Setting { 16 //! type Err = value::Error; 17 //! 18 //! fn from_str(s: &str) -> Result<Self, Self::Err> { 19 //! Self::deserialize(s.into_deserializer()) 20 //! } 21 //! } 22 //! ``` 23 24 use lib::*; 25 26 use self::private::{First, Second}; 27 use __private::size_hint; 28 use de::{self, Deserializer, Expected, IntoDeserializer, SeqAccess, Visitor}; 29 use ser; 30 31 //////////////////////////////////////////////////////////////////////////////// 32 33 // For structs that contain a PhantomData. We do not want the trait 34 // bound `E: Clone` inferred by derive(Clone). 35 macro_rules! impl_copy_clone { 36 ($ty:ident $(<$lifetime:tt>)*) => { 37 impl<$($lifetime,)* E> Copy for $ty<$($lifetime,)* E> {} 38 39 impl<$($lifetime,)* E> Clone for $ty<$($lifetime,)* E> { 40 fn clone(&self) -> Self { 41 *self 42 } 43 } 44 }; 45 } 46 47 //////////////////////////////////////////////////////////////////////////////// 48 49 /// A minimal representation of all possible errors that can occur using the 50 /// `IntoDeserializer` trait. 51 #[derive(Clone, PartialEq)] 52 pub struct Error { 53 err: ErrorImpl, 54 } 55 56 #[cfg(any(feature = "std", feature = "alloc"))] 57 type ErrorImpl = Box<str>; 58 #[cfg(not(any(feature = "std", feature = "alloc")))] 59 type ErrorImpl = (); 60 61 impl de::Error for Error { 62 #[cfg(any(feature = "std", feature = "alloc"))] 63 #[cold] custom<T>(msg: T) -> Self where T: Display,64 fn custom<T>(msg: T) -> Self 65 where 66 T: Display, 67 { 68 Error { 69 err: msg.to_string().into_boxed_str(), 70 } 71 } 72 73 #[cfg(not(any(feature = "std", feature = "alloc")))] 74 #[cold] custom<T>(msg: T) -> Self where T: Display,75 fn custom<T>(msg: T) -> Self 76 where 77 T: Display, 78 { 79 let _ = msg; 80 Error { err: () } 81 } 82 } 83 84 impl ser::Error for Error { 85 #[cold] custom<T>(msg: T) -> Self where T: Display,86 fn custom<T>(msg: T) -> Self 87 where 88 T: Display, 89 { 90 de::Error::custom(msg) 91 } 92 } 93 94 impl Display for Error { 95 #[cfg(any(feature = "std", feature = "alloc"))] fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result96 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 97 formatter.write_str(&self.err) 98 } 99 100 #[cfg(not(any(feature = "std", feature = "alloc")))] fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result101 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 102 formatter.write_str("Serde deserialization error") 103 } 104 } 105 106 impl Debug for Error { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result107 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 108 let mut debug = formatter.debug_tuple("Error"); 109 #[cfg(any(feature = "std", feature = "alloc"))] 110 debug.field(&self.err); 111 debug.finish() 112 } 113 } 114 115 #[cfg(feature = "std")] 116 impl error::Error for Error { description(&self) -> &str117 fn description(&self) -> &str { 118 &self.err 119 } 120 } 121 122 //////////////////////////////////////////////////////////////////////////////// 123 124 impl<'de, E> IntoDeserializer<'de, E> for () 125 where 126 E: de::Error, 127 { 128 type Deserializer = UnitDeserializer<E>; 129 into_deserializer(self) -> UnitDeserializer<E>130 fn into_deserializer(self) -> UnitDeserializer<E> { 131 UnitDeserializer::new() 132 } 133 } 134 135 /// A deserializer holding a `()`. 136 pub struct UnitDeserializer<E> { 137 marker: PhantomData<E>, 138 } 139 140 impl_copy_clone!(UnitDeserializer); 141 142 impl<E> UnitDeserializer<E> { 143 #[allow(missing_docs)] new() -> Self144 pub fn new() -> Self { 145 UnitDeserializer { 146 marker: PhantomData, 147 } 148 } 149 } 150 151 impl<'de, E> de::Deserializer<'de> for UnitDeserializer<E> 152 where 153 E: de::Error, 154 { 155 type Error = E; 156 157 forward_to_deserialize_any! { 158 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 159 bytes byte_buf unit unit_struct newtype_struct seq tuple tuple_struct 160 map struct enum identifier ignored_any 161 } 162 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,163 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 164 where 165 V: de::Visitor<'de>, 166 { 167 visitor.visit_unit() 168 } 169 deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,170 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> 171 where 172 V: de::Visitor<'de>, 173 { 174 visitor.visit_none() 175 } 176 } 177 178 impl<E> Debug for UnitDeserializer<E> { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result179 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 180 formatter.debug_struct("UnitDeserializer").finish() 181 } 182 } 183 184 //////////////////////////////////////////////////////////////////////////////// 185 186 /// A deserializer that cannot be instantiated. 187 #[cfg(feature = "unstable")] 188 pub struct NeverDeserializer<E> { 189 never: !, 190 marker: PhantomData<E>, 191 } 192 193 #[cfg(feature = "unstable")] 194 impl<'de, E> IntoDeserializer<'de, E> for ! 195 where 196 E: de::Error, 197 { 198 type Deserializer = NeverDeserializer<E>; 199 into_deserializer(self) -> Self::Deserializer200 fn into_deserializer(self) -> Self::Deserializer { 201 self 202 } 203 } 204 205 #[cfg(feature = "unstable")] 206 impl<'de, E> de::Deserializer<'de> for NeverDeserializer<E> 207 where 208 E: de::Error, 209 { 210 type Error = E; 211 deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,212 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error> 213 where 214 V: de::Visitor<'de>, 215 { 216 self.never 217 } 218 219 forward_to_deserialize_any! { 220 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 221 bytes byte_buf option unit unit_struct newtype_struct seq tuple 222 tuple_struct map struct enum identifier ignored_any 223 } 224 } 225 226 //////////////////////////////////////////////////////////////////////////////// 227 228 macro_rules! primitive_deserializer { 229 ($ty:ty, $doc:tt, $name:ident, $method:ident $($cast:tt)*) => { 230 #[doc = "A deserializer holding"] 231 #[doc = $doc] 232 pub struct $name<E> { 233 value: $ty, 234 marker: PhantomData<E> 235 } 236 237 impl_copy_clone!($name); 238 239 impl<'de, E> IntoDeserializer<'de, E> for $ty 240 where 241 E: de::Error, 242 { 243 type Deserializer = $name<E>; 244 245 fn into_deserializer(self) -> $name<E> { 246 $name::new(self) 247 } 248 } 249 250 impl<E> $name<E> { 251 #[allow(missing_docs)] 252 pub fn new(value: $ty) -> Self { 253 $name { 254 value: value, 255 marker: PhantomData, 256 } 257 } 258 } 259 260 impl<'de, E> de::Deserializer<'de> for $name<E> 261 where 262 E: de::Error, 263 { 264 type Error = E; 265 266 forward_to_deserialize_any! { 267 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str 268 string bytes byte_buf option unit unit_struct newtype_struct seq 269 tuple tuple_struct map struct enum identifier ignored_any 270 } 271 272 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 273 where 274 V: de::Visitor<'de>, 275 { 276 visitor.$method(self.value $($cast)*) 277 } 278 } 279 280 impl<E> Debug for $name<E> { 281 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 282 formatter 283 .debug_struct(stringify!($name)) 284 .field("value", &self.value) 285 .finish() 286 } 287 } 288 } 289 } 290 291 primitive_deserializer!(bool, "a `bool`.", BoolDeserializer, visit_bool); 292 primitive_deserializer!(i8, "an `i8`.", I8Deserializer, visit_i8); 293 primitive_deserializer!(i16, "an `i16`.", I16Deserializer, visit_i16); 294 primitive_deserializer!(i32, "an `i32`.", I32Deserializer, visit_i32); 295 primitive_deserializer!(i64, "an `i64`.", I64Deserializer, visit_i64); 296 primitive_deserializer!(isize, "an `isize`.", IsizeDeserializer, visit_i64 as i64); 297 primitive_deserializer!(u8, "a `u8`.", U8Deserializer, visit_u8); 298 primitive_deserializer!(u16, "a `u16`.", U16Deserializer, visit_u16); 299 primitive_deserializer!(u64, "a `u64`.", U64Deserializer, visit_u64); 300 primitive_deserializer!(usize, "a `usize`.", UsizeDeserializer, visit_u64 as u64); 301 primitive_deserializer!(f32, "an `f32`.", F32Deserializer, visit_f32); 302 primitive_deserializer!(f64, "an `f64`.", F64Deserializer, visit_f64); 303 primitive_deserializer!(char, "a `char`.", CharDeserializer, visit_char); 304 305 serde_if_integer128! { 306 primitive_deserializer!(i128, "an `i128`.", I128Deserializer, visit_i128); 307 primitive_deserializer!(u128, "a `u128`.", U128Deserializer, visit_u128); 308 } 309 310 /// A deserializer holding a `u32`. 311 pub struct U32Deserializer<E> { 312 value: u32, 313 marker: PhantomData<E>, 314 } 315 316 impl_copy_clone!(U32Deserializer); 317 318 impl<'de, E> IntoDeserializer<'de, E> for u32 319 where 320 E: de::Error, 321 { 322 type Deserializer = U32Deserializer<E>; 323 into_deserializer(self) -> U32Deserializer<E>324 fn into_deserializer(self) -> U32Deserializer<E> { 325 U32Deserializer::new(self) 326 } 327 } 328 329 impl<E> U32Deserializer<E> { 330 #[allow(missing_docs)] new(value: u32) -> Self331 pub fn new(value: u32) -> Self { 332 U32Deserializer { 333 value: value, 334 marker: PhantomData, 335 } 336 } 337 } 338 339 impl<'de, E> de::Deserializer<'de> for U32Deserializer<E> 340 where 341 E: de::Error, 342 { 343 type Error = E; 344 345 forward_to_deserialize_any! { 346 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 347 bytes byte_buf option unit unit_struct newtype_struct seq tuple 348 tuple_struct map struct identifier ignored_any 349 } 350 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,351 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 352 where 353 V: de::Visitor<'de>, 354 { 355 visitor.visit_u32(self.value) 356 } 357 deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,358 fn deserialize_enum<V>( 359 self, 360 name: &str, 361 variants: &'static [&'static str], 362 visitor: V, 363 ) -> Result<V::Value, Self::Error> 364 where 365 V: de::Visitor<'de>, 366 { 367 let _ = name; 368 let _ = variants; 369 visitor.visit_enum(self) 370 } 371 } 372 373 impl<'de, E> de::EnumAccess<'de> for U32Deserializer<E> 374 where 375 E: de::Error, 376 { 377 type Error = E; 378 type Variant = private::UnitOnly<E>; 379 variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,380 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> 381 where 382 T: de::DeserializeSeed<'de>, 383 { 384 seed.deserialize(self).map(private::unit_only) 385 } 386 } 387 388 impl<E> Debug for U32Deserializer<E> { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result389 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 390 formatter 391 .debug_struct("U32Deserializer") 392 .field("value", &self.value) 393 .finish() 394 } 395 } 396 397 //////////////////////////////////////////////////////////////////////////////// 398 399 /// A deserializer holding a `&str`. 400 pub struct StrDeserializer<'a, E> { 401 value: &'a str, 402 marker: PhantomData<E>, 403 } 404 405 impl_copy_clone!(StrDeserializer<'de>); 406 407 impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a str 408 where 409 E: de::Error, 410 { 411 type Deserializer = StrDeserializer<'a, E>; 412 into_deserializer(self) -> StrDeserializer<'a, E>413 fn into_deserializer(self) -> StrDeserializer<'a, E> { 414 StrDeserializer::new(self) 415 } 416 } 417 418 impl<'a, E> StrDeserializer<'a, E> { 419 #[allow(missing_docs)] new(value: &'a str) -> Self420 pub fn new(value: &'a str) -> Self { 421 StrDeserializer { 422 value: value, 423 marker: PhantomData, 424 } 425 } 426 } 427 428 impl<'de, 'a, E> de::Deserializer<'de> for StrDeserializer<'a, E> 429 where 430 E: de::Error, 431 { 432 type Error = E; 433 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,434 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 435 where 436 V: de::Visitor<'de>, 437 { 438 visitor.visit_str(self.value) 439 } 440 deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,441 fn deserialize_enum<V>( 442 self, 443 name: &str, 444 variants: &'static [&'static str], 445 visitor: V, 446 ) -> Result<V::Value, Self::Error> 447 where 448 V: de::Visitor<'de>, 449 { 450 let _ = name; 451 let _ = variants; 452 visitor.visit_enum(self) 453 } 454 455 forward_to_deserialize_any! { 456 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 457 bytes byte_buf option unit unit_struct newtype_struct seq tuple 458 tuple_struct map struct identifier ignored_any 459 } 460 } 461 462 impl<'de, 'a, E> de::EnumAccess<'de> for StrDeserializer<'a, E> 463 where 464 E: de::Error, 465 { 466 type Error = E; 467 type Variant = private::UnitOnly<E>; 468 variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,469 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> 470 where 471 T: de::DeserializeSeed<'de>, 472 { 473 seed.deserialize(self).map(private::unit_only) 474 } 475 } 476 477 impl<'a, E> Debug for StrDeserializer<'a, E> { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result478 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 479 formatter 480 .debug_struct("StrDeserializer") 481 .field("value", &self.value) 482 .finish() 483 } 484 } 485 486 //////////////////////////////////////////////////////////////////////////////// 487 488 /// A deserializer holding a `&str` with a lifetime tied to another 489 /// deserializer. 490 pub struct BorrowedStrDeserializer<'de, E> { 491 value: &'de str, 492 marker: PhantomData<E>, 493 } 494 495 impl_copy_clone!(BorrowedStrDeserializer<'de>); 496 497 impl<'de, E> BorrowedStrDeserializer<'de, E> { 498 /// Create a new borrowed deserializer from the given string. new(value: &'de str) -> BorrowedStrDeserializer<'de, E>499 pub fn new(value: &'de str) -> BorrowedStrDeserializer<'de, E> { 500 BorrowedStrDeserializer { 501 value: value, 502 marker: PhantomData, 503 } 504 } 505 } 506 507 impl<'de, E> de::Deserializer<'de> for BorrowedStrDeserializer<'de, E> 508 where 509 E: de::Error, 510 { 511 type Error = E; 512 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,513 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 514 where 515 V: de::Visitor<'de>, 516 { 517 visitor.visit_borrowed_str(self.value) 518 } 519 deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,520 fn deserialize_enum<V>( 521 self, 522 name: &str, 523 variants: &'static [&'static str], 524 visitor: V, 525 ) -> Result<V::Value, Self::Error> 526 where 527 V: de::Visitor<'de>, 528 { 529 let _ = name; 530 let _ = variants; 531 visitor.visit_enum(self) 532 } 533 534 forward_to_deserialize_any! { 535 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 536 bytes byte_buf option unit unit_struct newtype_struct seq tuple 537 tuple_struct map struct identifier ignored_any 538 } 539 } 540 541 impl<'de, E> de::EnumAccess<'de> for BorrowedStrDeserializer<'de, E> 542 where 543 E: de::Error, 544 { 545 type Error = E; 546 type Variant = private::UnitOnly<E>; 547 variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,548 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> 549 where 550 T: de::DeserializeSeed<'de>, 551 { 552 seed.deserialize(self).map(private::unit_only) 553 } 554 } 555 556 impl<'de, E> Debug for BorrowedStrDeserializer<'de, E> { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result557 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 558 formatter 559 .debug_struct("BorrowedStrDeserializer") 560 .field("value", &self.value) 561 .finish() 562 } 563 } 564 565 //////////////////////////////////////////////////////////////////////////////// 566 567 /// A deserializer holding a `String`. 568 #[cfg(any(feature = "std", feature = "alloc"))] 569 pub struct StringDeserializer<E> { 570 value: String, 571 marker: PhantomData<E>, 572 } 573 574 #[cfg(any(feature = "std", feature = "alloc"))] 575 impl<E> Clone for StringDeserializer<E> { clone(&self) -> Self576 fn clone(&self) -> Self { 577 StringDeserializer { 578 value: self.value.clone(), 579 marker: PhantomData, 580 } 581 } 582 } 583 584 #[cfg(any(feature = "std", feature = "alloc"))] 585 impl<'de, E> IntoDeserializer<'de, E> for String 586 where 587 E: de::Error, 588 { 589 type Deserializer = StringDeserializer<E>; 590 into_deserializer(self) -> StringDeserializer<E>591 fn into_deserializer(self) -> StringDeserializer<E> { 592 StringDeserializer::new(self) 593 } 594 } 595 596 #[cfg(any(feature = "std", feature = "alloc"))] 597 impl<E> StringDeserializer<E> { 598 #[allow(missing_docs)] new(value: String) -> Self599 pub fn new(value: String) -> Self { 600 StringDeserializer { 601 value: value, 602 marker: PhantomData, 603 } 604 } 605 } 606 607 #[cfg(any(feature = "std", feature = "alloc"))] 608 impl<'de, E> de::Deserializer<'de> for StringDeserializer<E> 609 where 610 E: de::Error, 611 { 612 type Error = E; 613 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,614 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 615 where 616 V: de::Visitor<'de>, 617 { 618 visitor.visit_string(self.value) 619 } 620 deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,621 fn deserialize_enum<V>( 622 self, 623 name: &str, 624 variants: &'static [&'static str], 625 visitor: V, 626 ) -> Result<V::Value, Self::Error> 627 where 628 V: de::Visitor<'de>, 629 { 630 let _ = name; 631 let _ = variants; 632 visitor.visit_enum(self) 633 } 634 635 forward_to_deserialize_any! { 636 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 637 bytes byte_buf option unit unit_struct newtype_struct seq tuple 638 tuple_struct map struct identifier ignored_any 639 } 640 } 641 642 #[cfg(any(feature = "std", feature = "alloc"))] 643 impl<'de, E> de::EnumAccess<'de> for StringDeserializer<E> 644 where 645 E: de::Error, 646 { 647 type Error = E; 648 type Variant = private::UnitOnly<E>; 649 variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,650 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> 651 where 652 T: de::DeserializeSeed<'de>, 653 { 654 seed.deserialize(self).map(private::unit_only) 655 } 656 } 657 658 #[cfg(any(feature = "std", feature = "alloc"))] 659 impl<E> Debug for StringDeserializer<E> { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result660 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 661 formatter 662 .debug_struct("StringDeserializer") 663 .field("value", &self.value) 664 .finish() 665 } 666 } 667 668 //////////////////////////////////////////////////////////////////////////////// 669 670 /// A deserializer holding a `Cow<str>`. 671 #[cfg(any(feature = "std", feature = "alloc"))] 672 pub struct CowStrDeserializer<'a, E> { 673 value: Cow<'a, str>, 674 marker: PhantomData<E>, 675 } 676 677 #[cfg(any(feature = "std", feature = "alloc"))] 678 impl<'a, E> Clone for CowStrDeserializer<'a, E> { clone(&self) -> Self679 fn clone(&self) -> Self { 680 CowStrDeserializer { 681 value: self.value.clone(), 682 marker: PhantomData, 683 } 684 } 685 } 686 687 #[cfg(any(feature = "std", feature = "alloc"))] 688 impl<'de, 'a, E> IntoDeserializer<'de, E> for Cow<'a, str> 689 where 690 E: de::Error, 691 { 692 type Deserializer = CowStrDeserializer<'a, E>; 693 into_deserializer(self) -> CowStrDeserializer<'a, E>694 fn into_deserializer(self) -> CowStrDeserializer<'a, E> { 695 CowStrDeserializer::new(self) 696 } 697 } 698 699 #[cfg(any(feature = "std", feature = "alloc"))] 700 impl<'a, E> CowStrDeserializer<'a, E> { 701 #[allow(missing_docs)] new(value: Cow<'a, str>) -> Self702 pub fn new(value: Cow<'a, str>) -> Self { 703 CowStrDeserializer { 704 value: value, 705 marker: PhantomData, 706 } 707 } 708 } 709 710 #[cfg(any(feature = "std", feature = "alloc"))] 711 impl<'de, 'a, E> de::Deserializer<'de> for CowStrDeserializer<'a, E> 712 where 713 E: de::Error, 714 { 715 type Error = E; 716 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,717 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 718 where 719 V: de::Visitor<'de>, 720 { 721 match self.value { 722 Cow::Borrowed(string) => visitor.visit_str(string), 723 Cow::Owned(string) => visitor.visit_string(string), 724 } 725 } 726 deserialize_enum<V>( self, name: &str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,727 fn deserialize_enum<V>( 728 self, 729 name: &str, 730 variants: &'static [&'static str], 731 visitor: V, 732 ) -> Result<V::Value, Self::Error> 733 where 734 V: de::Visitor<'de>, 735 { 736 let _ = name; 737 let _ = variants; 738 visitor.visit_enum(self) 739 } 740 741 forward_to_deserialize_any! { 742 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 743 bytes byte_buf option unit unit_struct newtype_struct seq tuple 744 tuple_struct map struct identifier ignored_any 745 } 746 } 747 748 #[cfg(any(feature = "std", feature = "alloc"))] 749 impl<'de, 'a, E> de::EnumAccess<'de> for CowStrDeserializer<'a, E> 750 where 751 E: de::Error, 752 { 753 type Error = E; 754 type Variant = private::UnitOnly<E>; 755 variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,756 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> 757 where 758 T: de::DeserializeSeed<'de>, 759 { 760 seed.deserialize(self).map(private::unit_only) 761 } 762 } 763 764 #[cfg(any(feature = "std", feature = "alloc"))] 765 impl<'a, E> Debug for CowStrDeserializer<'a, E> { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result766 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 767 formatter 768 .debug_struct("CowStrDeserializer") 769 .field("value", &self.value) 770 .finish() 771 } 772 } 773 774 //////////////////////////////////////////////////////////////////////////////// 775 776 /// A deserializer holding a `&[u8]`. Always calls [`Visitor::visit_bytes`]. 777 pub struct BytesDeserializer<'a, E> { 778 value: &'a [u8], 779 marker: PhantomData<E>, 780 } 781 782 impl<'a, E> BytesDeserializer<'a, E> { 783 /// Create a new deserializer from the given bytes. new(value: &'a [u8]) -> Self784 pub fn new(value: &'a [u8]) -> Self { 785 BytesDeserializer { 786 value: value, 787 marker: PhantomData, 788 } 789 } 790 } 791 792 impl_copy_clone!(BytesDeserializer<'a>); 793 794 impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a [u8] 795 where 796 E: de::Error, 797 { 798 type Deserializer = BytesDeserializer<'a, E>; 799 into_deserializer(self) -> BytesDeserializer<'a, E>800 fn into_deserializer(self) -> BytesDeserializer<'a, E> { 801 BytesDeserializer::new(self) 802 } 803 } 804 805 impl<'de, 'a, E> Deserializer<'de> for BytesDeserializer<'a, E> 806 where 807 E: de::Error, 808 { 809 type Error = E; 810 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,811 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 812 where 813 V: Visitor<'de>, 814 { 815 visitor.visit_bytes(self.value) 816 } 817 818 forward_to_deserialize_any! { 819 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 820 bytes byte_buf option unit unit_struct newtype_struct seq tuple 821 tuple_struct map struct enum identifier ignored_any 822 } 823 } 824 825 impl<'a, E> Debug for BytesDeserializer<'a, E> { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result826 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 827 formatter 828 .debug_struct("BytesDeserializer") 829 .field("value", &self.value) 830 .finish() 831 } 832 } 833 834 /// A deserializer holding a `&[u8]` with a lifetime tied to another 835 /// deserializer. Always calls [`Visitor::visit_borrowed_bytes`]. 836 pub struct BorrowedBytesDeserializer<'de, E> { 837 value: &'de [u8], 838 marker: PhantomData<E>, 839 } 840 841 impl<'de, E> BorrowedBytesDeserializer<'de, E> { 842 /// Create a new borrowed deserializer from the given borrowed bytes. new(value: &'de [u8]) -> Self843 pub fn new(value: &'de [u8]) -> Self { 844 BorrowedBytesDeserializer { 845 value: value, 846 marker: PhantomData, 847 } 848 } 849 } 850 851 impl_copy_clone!(BorrowedBytesDeserializer<'de>); 852 853 impl<'de, E> Deserializer<'de> for BorrowedBytesDeserializer<'de, E> 854 where 855 E: de::Error, 856 { 857 type Error = E; 858 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,859 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 860 where 861 V: Visitor<'de>, 862 { 863 visitor.visit_borrowed_bytes(self.value) 864 } 865 866 forward_to_deserialize_any! { 867 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 868 bytes byte_buf option unit unit_struct newtype_struct seq tuple 869 tuple_struct map struct enum identifier ignored_any 870 } 871 } 872 873 impl<'de, E> Debug for BorrowedBytesDeserializer<'de, E> { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result874 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 875 formatter 876 .debug_struct("BorrowedBytesDeserializer") 877 .field("value", &self.value) 878 .finish() 879 } 880 } 881 882 //////////////////////////////////////////////////////////////////////////////// 883 884 /// A deserializer that iterates over a sequence. 885 #[derive(Clone)] 886 pub struct SeqDeserializer<I, E> { 887 iter: iter::Fuse<I>, 888 count: usize, 889 marker: PhantomData<E>, 890 } 891 892 impl<I, E> SeqDeserializer<I, E> 893 where 894 I: Iterator, 895 { 896 /// Construct a new `SeqDeserializer<I, E>`. new(iter: I) -> Self897 pub fn new(iter: I) -> Self { 898 SeqDeserializer { 899 iter: iter.fuse(), 900 count: 0, 901 marker: PhantomData, 902 } 903 } 904 } 905 906 impl<I, E> SeqDeserializer<I, E> 907 where 908 I: Iterator, 909 E: de::Error, 910 { 911 /// Check for remaining elements after passing a `SeqDeserializer` to 912 /// `Visitor::visit_seq`. end(self) -> Result<(), E>913 pub fn end(self) -> Result<(), E> { 914 let remaining = self.iter.count(); 915 if remaining == 0 { 916 Ok(()) 917 } else { 918 // First argument is the number of elements in the data, second 919 // argument is the number of elements expected by the Deserialize. 920 Err(de::Error::invalid_length( 921 self.count + remaining, 922 &ExpectedInSeq(self.count), 923 )) 924 } 925 } 926 } 927 928 impl<'de, I, T, E> de::Deserializer<'de> for SeqDeserializer<I, E> 929 where 930 I: Iterator<Item = T>, 931 T: IntoDeserializer<'de, E>, 932 E: de::Error, 933 { 934 type Error = E; 935 deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,936 fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> 937 where 938 V: de::Visitor<'de>, 939 { 940 let v = try!(visitor.visit_seq(&mut self)); 941 try!(self.end()); 942 Ok(v) 943 } 944 945 forward_to_deserialize_any! { 946 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 947 bytes byte_buf option unit unit_struct newtype_struct seq tuple 948 tuple_struct map struct enum identifier ignored_any 949 } 950 } 951 952 impl<'de, I, T, E> de::SeqAccess<'de> for SeqDeserializer<I, E> 953 where 954 I: Iterator<Item = T>, 955 T: IntoDeserializer<'de, E>, 956 E: de::Error, 957 { 958 type Error = E; 959 next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error> where V: de::DeserializeSeed<'de>,960 fn next_element_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, Self::Error> 961 where 962 V: de::DeserializeSeed<'de>, 963 { 964 match self.iter.next() { 965 Some(value) => { 966 self.count += 1; 967 seed.deserialize(value.into_deserializer()).map(Some) 968 } 969 None => Ok(None), 970 } 971 } 972 size_hint(&self) -> Option<usize>973 fn size_hint(&self) -> Option<usize> { 974 size_hint::from_bounds(&self.iter) 975 } 976 } 977 978 struct ExpectedInSeq(usize); 979 980 impl Expected for ExpectedInSeq { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result981 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 982 if self.0 == 1 { 983 write!(formatter, "1 element in sequence") 984 } else { 985 write!(formatter, "{} elements in sequence", self.0) 986 } 987 } 988 } 989 990 impl<I, E> Debug for SeqDeserializer<I, E> 991 where 992 I: Debug, 993 { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result994 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 995 formatter 996 .debug_struct("SeqDeserializer") 997 .field("iter", &self.iter) 998 .field("count", &self.count) 999 .finish() 1000 } 1001 } 1002 1003 //////////////////////////////////////////////////////////////////////////////// 1004 1005 #[cfg(any(feature = "std", feature = "alloc"))] 1006 impl<'de, T, E> IntoDeserializer<'de, E> for Vec<T> 1007 where 1008 T: IntoDeserializer<'de, E>, 1009 E: de::Error, 1010 { 1011 type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>; 1012 into_deserializer(self) -> Self::Deserializer1013 fn into_deserializer(self) -> Self::Deserializer { 1014 SeqDeserializer::new(self.into_iter()) 1015 } 1016 } 1017 1018 #[cfg(any(feature = "std", feature = "alloc"))] 1019 impl<'de, T, E> IntoDeserializer<'de, E> for BTreeSet<T> 1020 where 1021 T: IntoDeserializer<'de, E> + Eq + Ord, 1022 E: de::Error, 1023 { 1024 type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>; 1025 into_deserializer(self) -> Self::Deserializer1026 fn into_deserializer(self) -> Self::Deserializer { 1027 SeqDeserializer::new(self.into_iter()) 1028 } 1029 } 1030 1031 #[cfg(feature = "std")] 1032 impl<'de, T, S, E> IntoDeserializer<'de, E> for HashSet<T, S> 1033 where 1034 T: IntoDeserializer<'de, E> + Eq + Hash, 1035 S: BuildHasher, 1036 E: de::Error, 1037 { 1038 type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>; 1039 into_deserializer(self) -> Self::Deserializer1040 fn into_deserializer(self) -> Self::Deserializer { 1041 SeqDeserializer::new(self.into_iter()) 1042 } 1043 } 1044 1045 //////////////////////////////////////////////////////////////////////////////// 1046 1047 /// A deserializer holding a `SeqAccess`. 1048 #[derive(Clone, Debug)] 1049 pub struct SeqAccessDeserializer<A> { 1050 seq: A, 1051 } 1052 1053 impl<A> SeqAccessDeserializer<A> { 1054 /// Construct a new `SeqAccessDeserializer<A>`. new(seq: A) -> Self1055 pub fn new(seq: A) -> Self { 1056 SeqAccessDeserializer { seq: seq } 1057 } 1058 } 1059 1060 impl<'de, A> de::Deserializer<'de> for SeqAccessDeserializer<A> 1061 where 1062 A: de::SeqAccess<'de>, 1063 { 1064 type Error = A::Error; 1065 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1066 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 1067 where 1068 V: de::Visitor<'de>, 1069 { 1070 visitor.visit_seq(self.seq) 1071 } 1072 1073 forward_to_deserialize_any! { 1074 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 1075 bytes byte_buf option unit unit_struct newtype_struct seq tuple 1076 tuple_struct map struct enum identifier ignored_any 1077 } 1078 } 1079 1080 //////////////////////////////////////////////////////////////////////////////// 1081 1082 /// A deserializer that iterates over a map. 1083 pub struct MapDeserializer<'de, I, E> 1084 where 1085 I: Iterator, 1086 I::Item: private::Pair, 1087 { 1088 iter: iter::Fuse<I>, 1089 value: Option<Second<I::Item>>, 1090 count: usize, 1091 lifetime: PhantomData<&'de ()>, 1092 error: PhantomData<E>, 1093 } 1094 1095 impl<'de, I, E> MapDeserializer<'de, I, E> 1096 where 1097 I: Iterator, 1098 I::Item: private::Pair, 1099 { 1100 /// Construct a new `MapDeserializer<I, E>`. new(iter: I) -> Self1101 pub fn new(iter: I) -> Self { 1102 MapDeserializer { 1103 iter: iter.fuse(), 1104 value: None, 1105 count: 0, 1106 lifetime: PhantomData, 1107 error: PhantomData, 1108 } 1109 } 1110 } 1111 1112 impl<'de, I, E> MapDeserializer<'de, I, E> 1113 where 1114 I: Iterator, 1115 I::Item: private::Pair, 1116 E: de::Error, 1117 { 1118 /// Check for remaining elements after passing a `MapDeserializer` to 1119 /// `Visitor::visit_map`. end(self) -> Result<(), E>1120 pub fn end(self) -> Result<(), E> { 1121 let remaining = self.iter.count(); 1122 if remaining == 0 { 1123 Ok(()) 1124 } else { 1125 // First argument is the number of elements in the data, second 1126 // argument is the number of elements expected by the Deserialize. 1127 Err(de::Error::invalid_length( 1128 self.count + remaining, 1129 &ExpectedInMap(self.count), 1130 )) 1131 } 1132 } 1133 } 1134 1135 impl<'de, I, E> MapDeserializer<'de, I, E> 1136 where 1137 I: Iterator, 1138 I::Item: private::Pair, 1139 { next_pair(&mut self) -> Option<(First<I::Item>, Second<I::Item>)>1140 fn next_pair(&mut self) -> Option<(First<I::Item>, Second<I::Item>)> { 1141 match self.iter.next() { 1142 Some(kv) => { 1143 self.count += 1; 1144 Some(private::Pair::split(kv)) 1145 } 1146 None => None, 1147 } 1148 } 1149 } 1150 1151 impl<'de, I, E> de::Deserializer<'de> for MapDeserializer<'de, I, E> 1152 where 1153 I: Iterator, 1154 I::Item: private::Pair, 1155 First<I::Item>: IntoDeserializer<'de, E>, 1156 Second<I::Item>: IntoDeserializer<'de, E>, 1157 E: de::Error, 1158 { 1159 type Error = E; 1160 deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1161 fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> 1162 where 1163 V: de::Visitor<'de>, 1164 { 1165 let value = try!(visitor.visit_map(&mut self)); 1166 try!(self.end()); 1167 Ok(value) 1168 } 1169 deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1170 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> 1171 where 1172 V: de::Visitor<'de>, 1173 { 1174 let value = try!(visitor.visit_seq(&mut self)); 1175 try!(self.end()); 1176 Ok(value) 1177 } 1178 deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1179 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> 1180 where 1181 V: de::Visitor<'de>, 1182 { 1183 let _ = len; 1184 self.deserialize_seq(visitor) 1185 } 1186 1187 forward_to_deserialize_any! { 1188 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 1189 bytes byte_buf option unit unit_struct newtype_struct tuple_struct map 1190 struct enum identifier ignored_any 1191 } 1192 } 1193 1194 impl<'de, I, E> de::MapAccess<'de> for MapDeserializer<'de, I, E> 1195 where 1196 I: Iterator, 1197 I::Item: private::Pair, 1198 First<I::Item>: IntoDeserializer<'de, E>, 1199 Second<I::Item>: IntoDeserializer<'de, E>, 1200 E: de::Error, 1201 { 1202 type Error = E; 1203 next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed<'de>,1204 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> 1205 where 1206 T: de::DeserializeSeed<'de>, 1207 { 1208 match self.next_pair() { 1209 Some((key, value)) => { 1210 self.value = Some(value); 1211 seed.deserialize(key.into_deserializer()).map(Some) 1212 } 1213 None => Ok(None), 1214 } 1215 } 1216 next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> where T: de::DeserializeSeed<'de>,1217 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> 1218 where 1219 T: de::DeserializeSeed<'de>, 1220 { 1221 let value = self.value.take(); 1222 // Panic because this indicates a bug in the program rather than an 1223 // expected failure. 1224 let value = value.expect("MapAccess::next_value called before next_key"); 1225 seed.deserialize(value.into_deserializer()) 1226 } 1227 next_entry_seed<TK, TV>( &mut self, kseed: TK, vseed: TV, ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error> where TK: de::DeserializeSeed<'de>, TV: de::DeserializeSeed<'de>,1228 fn next_entry_seed<TK, TV>( 1229 &mut self, 1230 kseed: TK, 1231 vseed: TV, 1232 ) -> Result<Option<(TK::Value, TV::Value)>, Self::Error> 1233 where 1234 TK: de::DeserializeSeed<'de>, 1235 TV: de::DeserializeSeed<'de>, 1236 { 1237 match self.next_pair() { 1238 Some((key, value)) => { 1239 let key = try!(kseed.deserialize(key.into_deserializer())); 1240 let value = try!(vseed.deserialize(value.into_deserializer())); 1241 Ok(Some((key, value))) 1242 } 1243 None => Ok(None), 1244 } 1245 } 1246 size_hint(&self) -> Option<usize>1247 fn size_hint(&self) -> Option<usize> { 1248 size_hint::from_bounds(&self.iter) 1249 } 1250 } 1251 1252 impl<'de, I, E> de::SeqAccess<'de> for MapDeserializer<'de, I, E> 1253 where 1254 I: Iterator, 1255 I::Item: private::Pair, 1256 First<I::Item>: IntoDeserializer<'de, E>, 1257 Second<I::Item>: IntoDeserializer<'de, E>, 1258 E: de::Error, 1259 { 1260 type Error = E; 1261 next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed<'de>,1262 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> 1263 where 1264 T: de::DeserializeSeed<'de>, 1265 { 1266 match self.next_pair() { 1267 Some((k, v)) => { 1268 let de = PairDeserializer(k, v, PhantomData); 1269 seed.deserialize(de).map(Some) 1270 } 1271 None => Ok(None), 1272 } 1273 } 1274 size_hint(&self) -> Option<usize>1275 fn size_hint(&self) -> Option<usize> { 1276 size_hint::from_bounds(&self.iter) 1277 } 1278 } 1279 1280 // Cannot #[derive(Clone)] because of the bound `Second<I::Item>: Clone`. 1281 impl<'de, I, E> Clone for MapDeserializer<'de, I, E> 1282 where 1283 I: Iterator + Clone, 1284 I::Item: private::Pair, 1285 Second<I::Item>: Clone, 1286 { clone(&self) -> Self1287 fn clone(&self) -> Self { 1288 MapDeserializer { 1289 iter: self.iter.clone(), 1290 value: self.value.clone(), 1291 count: self.count, 1292 lifetime: self.lifetime, 1293 error: self.error, 1294 } 1295 } 1296 } 1297 1298 impl<'de, I, E> Debug for MapDeserializer<'de, I, E> 1299 where 1300 I: Iterator + Debug, 1301 I::Item: private::Pair, 1302 Second<I::Item>: Debug, 1303 { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result1304 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 1305 formatter 1306 .debug_struct("MapDeserializer") 1307 .field("iter", &self.iter) 1308 .field("value", &self.value) 1309 .field("count", &self.count) 1310 .finish() 1311 } 1312 } 1313 1314 // Used in the `impl SeqAccess for MapDeserializer` to visit the map as a 1315 // sequence of pairs. 1316 struct PairDeserializer<A, B, E>(A, B, PhantomData<E>); 1317 1318 impl<'de, A, B, E> de::Deserializer<'de> for PairDeserializer<A, B, E> 1319 where 1320 A: IntoDeserializer<'de, E>, 1321 B: IntoDeserializer<'de, E>, 1322 E: de::Error, 1323 { 1324 type Error = E; 1325 1326 forward_to_deserialize_any! { 1327 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 1328 bytes byte_buf option unit unit_struct newtype_struct tuple_struct map 1329 struct enum identifier ignored_any 1330 } 1331 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1332 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 1333 where 1334 V: de::Visitor<'de>, 1335 { 1336 self.deserialize_seq(visitor) 1337 } 1338 deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1339 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> 1340 where 1341 V: de::Visitor<'de>, 1342 { 1343 let mut pair_visitor = PairVisitor(Some(self.0), Some(self.1), PhantomData); 1344 let pair = try!(visitor.visit_seq(&mut pair_visitor)); 1345 if pair_visitor.1.is_none() { 1346 Ok(pair) 1347 } else { 1348 let remaining = pair_visitor.size_hint().unwrap(); 1349 // First argument is the number of elements in the data, second 1350 // argument is the number of elements expected by the Deserialize. 1351 Err(de::Error::invalid_length(2, &ExpectedInSeq(2 - remaining))) 1352 } 1353 } 1354 deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1355 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> 1356 where 1357 V: de::Visitor<'de>, 1358 { 1359 if len == 2 { 1360 self.deserialize_seq(visitor) 1361 } else { 1362 // First argument is the number of elements in the data, second 1363 // argument is the number of elements expected by the Deserialize. 1364 Err(de::Error::invalid_length(2, &ExpectedInSeq(len))) 1365 } 1366 } 1367 } 1368 1369 struct PairVisitor<A, B, E>(Option<A>, Option<B>, PhantomData<E>); 1370 1371 impl<'de, A, B, E> de::SeqAccess<'de> for PairVisitor<A, B, E> 1372 where 1373 A: IntoDeserializer<'de, E>, 1374 B: IntoDeserializer<'de, E>, 1375 E: de::Error, 1376 { 1377 type Error = E; 1378 next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed<'de>,1379 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> 1380 where 1381 T: de::DeserializeSeed<'de>, 1382 { 1383 if let Some(k) = self.0.take() { 1384 seed.deserialize(k.into_deserializer()).map(Some) 1385 } else if let Some(v) = self.1.take() { 1386 seed.deserialize(v.into_deserializer()).map(Some) 1387 } else { 1388 Ok(None) 1389 } 1390 } 1391 size_hint(&self) -> Option<usize>1392 fn size_hint(&self) -> Option<usize> { 1393 if self.0.is_some() { 1394 Some(2) 1395 } else if self.1.is_some() { 1396 Some(1) 1397 } else { 1398 Some(0) 1399 } 1400 } 1401 } 1402 1403 struct ExpectedInMap(usize); 1404 1405 impl Expected for ExpectedInMap { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result1406 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 1407 if self.0 == 1 { 1408 write!(formatter, "1 element in map") 1409 } else { 1410 write!(formatter, "{} elements in map", self.0) 1411 } 1412 } 1413 } 1414 1415 //////////////////////////////////////////////////////////////////////////////// 1416 1417 #[cfg(any(feature = "std", feature = "alloc"))] 1418 impl<'de, K, V, E> IntoDeserializer<'de, E> for BTreeMap<K, V> 1419 where 1420 K: IntoDeserializer<'de, E> + Eq + Ord, 1421 V: IntoDeserializer<'de, E>, 1422 E: de::Error, 1423 { 1424 type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>; 1425 into_deserializer(self) -> Self::Deserializer1426 fn into_deserializer(self) -> Self::Deserializer { 1427 MapDeserializer::new(self.into_iter()) 1428 } 1429 } 1430 1431 #[cfg(feature = "std")] 1432 impl<'de, K, V, S, E> IntoDeserializer<'de, E> for HashMap<K, V, S> 1433 where 1434 K: IntoDeserializer<'de, E> + Eq + Hash, 1435 V: IntoDeserializer<'de, E>, 1436 S: BuildHasher, 1437 E: de::Error, 1438 { 1439 type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>; 1440 into_deserializer(self) -> Self::Deserializer1441 fn into_deserializer(self) -> Self::Deserializer { 1442 MapDeserializer::new(self.into_iter()) 1443 } 1444 } 1445 1446 //////////////////////////////////////////////////////////////////////////////// 1447 1448 /// A deserializer holding a `MapAccess`. 1449 #[derive(Clone, Debug)] 1450 pub struct MapAccessDeserializer<A> { 1451 map: A, 1452 } 1453 1454 impl<A> MapAccessDeserializer<A> { 1455 /// Construct a new `MapAccessDeserializer<A>`. new(map: A) -> Self1456 pub fn new(map: A) -> Self { 1457 MapAccessDeserializer { map: map } 1458 } 1459 } 1460 1461 impl<'de, A> de::Deserializer<'de> for MapAccessDeserializer<A> 1462 where 1463 A: de::MapAccess<'de>, 1464 { 1465 type Error = A::Error; 1466 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1467 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 1468 where 1469 V: de::Visitor<'de>, 1470 { 1471 visitor.visit_map(self.map) 1472 } 1473 deserialize_enum<V>( self, _name: &str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1474 fn deserialize_enum<V>( 1475 self, 1476 _name: &str, 1477 _variants: &'static [&'static str], 1478 visitor: V, 1479 ) -> Result<V::Value, Self::Error> 1480 where 1481 V: de::Visitor<'de>, 1482 { 1483 visitor.visit_enum(self) 1484 } 1485 1486 forward_to_deserialize_any! { 1487 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 1488 bytes byte_buf option unit unit_struct newtype_struct seq tuple 1489 tuple_struct map struct identifier ignored_any 1490 } 1491 } 1492 1493 impl<'de, A> de::EnumAccess<'de> for MapAccessDeserializer<A> 1494 where 1495 A: de::MapAccess<'de>, 1496 { 1497 type Error = A::Error; 1498 type Variant = private::MapAsEnum<A>; 1499 variant_seed<T>(mut self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> where T: de::DeserializeSeed<'de>,1500 fn variant_seed<T>(mut self, seed: T) -> Result<(T::Value, Self::Variant), Self::Error> 1501 where 1502 T: de::DeserializeSeed<'de>, 1503 { 1504 match try!(self.map.next_key_seed(seed)) { 1505 Some(key) => Ok((key, private::map_as_enum(self.map))), 1506 None => Err(de::Error::invalid_type(de::Unexpected::Map, &"enum")), 1507 } 1508 } 1509 } 1510 1511 //////////////////////////////////////////////////////////////////////////////// 1512 1513 /// A deserializer holding an `EnumAccess`. 1514 #[derive(Clone, Debug)] 1515 pub struct EnumAccessDeserializer<A> { 1516 access: A, 1517 } 1518 1519 impl<A> EnumAccessDeserializer<A> { 1520 /// Construct a new `EnumAccessDeserializer<A>`. new(access: A) -> Self1521 pub fn new(access: A) -> Self { 1522 EnumAccessDeserializer { access: access } 1523 } 1524 } 1525 1526 impl<'de, A> de::Deserializer<'de> for EnumAccessDeserializer<A> 1527 where 1528 A: de::EnumAccess<'de>, 1529 { 1530 type Error = A::Error; 1531 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1532 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 1533 where 1534 V: de::Visitor<'de>, 1535 { 1536 visitor.visit_enum(self.access) 1537 } 1538 1539 forward_to_deserialize_any! { 1540 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string 1541 bytes byte_buf option unit unit_struct newtype_struct seq tuple 1542 tuple_struct map struct enum identifier ignored_any 1543 } 1544 } 1545 1546 //////////////////////////////////////////////////////////////////////////////// 1547 1548 mod private { 1549 use lib::*; 1550 1551 use de::{self, DeserializeSeed, Deserializer, MapAccess, Unexpected, VariantAccess, Visitor}; 1552 1553 pub struct UnitOnly<E> { 1554 marker: PhantomData<E>, 1555 } 1556 unit_only<T, E>(t: T) -> (T, UnitOnly<E>)1557 pub fn unit_only<T, E>(t: T) -> (T, UnitOnly<E>) { 1558 ( 1559 t, 1560 UnitOnly { 1561 marker: PhantomData, 1562 }, 1563 ) 1564 } 1565 1566 impl<'de, E> de::VariantAccess<'de> for UnitOnly<E> 1567 where 1568 E: de::Error, 1569 { 1570 type Error = E; 1571 unit_variant(self) -> Result<(), Self::Error>1572 fn unit_variant(self) -> Result<(), Self::Error> { 1573 Ok(()) 1574 } 1575 newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error> where T: de::DeserializeSeed<'de>,1576 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Self::Error> 1577 where 1578 T: de::DeserializeSeed<'de>, 1579 { 1580 Err(de::Error::invalid_type( 1581 Unexpected::UnitVariant, 1582 &"newtype variant", 1583 )) 1584 } 1585 tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1586 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Self::Error> 1587 where 1588 V: de::Visitor<'de>, 1589 { 1590 Err(de::Error::invalid_type( 1591 Unexpected::UnitVariant, 1592 &"tuple variant", 1593 )) 1594 } 1595 struct_variant<V>( self, _fields: &'static [&'static str], _visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,1596 fn struct_variant<V>( 1597 self, 1598 _fields: &'static [&'static str], 1599 _visitor: V, 1600 ) -> Result<V::Value, Self::Error> 1601 where 1602 V: de::Visitor<'de>, 1603 { 1604 Err(de::Error::invalid_type( 1605 Unexpected::UnitVariant, 1606 &"struct variant", 1607 )) 1608 } 1609 } 1610 1611 pub struct MapAsEnum<A> { 1612 map: A, 1613 } 1614 map_as_enum<A>(map: A) -> MapAsEnum<A>1615 pub fn map_as_enum<A>(map: A) -> MapAsEnum<A> { 1616 MapAsEnum { map: map } 1617 } 1618 1619 impl<'de, A> VariantAccess<'de> for MapAsEnum<A> 1620 where 1621 A: MapAccess<'de>, 1622 { 1623 type Error = A::Error; 1624 unit_variant(mut self) -> Result<(), Self::Error>1625 fn unit_variant(mut self) -> Result<(), Self::Error> { 1626 self.map.next_value() 1627 } 1628 newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error> where T: DeserializeSeed<'de>,1629 fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value, Self::Error> 1630 where 1631 T: DeserializeSeed<'de>, 1632 { 1633 self.map.next_value_seed(seed) 1634 } 1635 tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor<'de>,1636 fn tuple_variant<V>(mut self, len: usize, visitor: V) -> Result<V::Value, Self::Error> 1637 where 1638 V: Visitor<'de>, 1639 { 1640 self.map.next_value_seed(SeedTupleVariant { 1641 len: len, 1642 visitor: visitor, 1643 }) 1644 } 1645 struct_variant<V>( mut self, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: Visitor<'de>,1646 fn struct_variant<V>( 1647 mut self, 1648 _fields: &'static [&'static str], 1649 visitor: V, 1650 ) -> Result<V::Value, Self::Error> 1651 where 1652 V: Visitor<'de>, 1653 { 1654 self.map 1655 .next_value_seed(SeedStructVariant { visitor: visitor }) 1656 } 1657 } 1658 1659 struct SeedTupleVariant<V> { 1660 len: usize, 1661 visitor: V, 1662 } 1663 1664 impl<'de, V> DeserializeSeed<'de> for SeedTupleVariant<V> 1665 where 1666 V: Visitor<'de>, 1667 { 1668 type Value = V::Value; 1669 deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,1670 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 1671 where 1672 D: Deserializer<'de>, 1673 { 1674 deserializer.deserialize_tuple(self.len, self.visitor) 1675 } 1676 } 1677 1678 struct SeedStructVariant<V> { 1679 visitor: V, 1680 } 1681 1682 impl<'de, V> DeserializeSeed<'de> for SeedStructVariant<V> 1683 where 1684 V: Visitor<'de>, 1685 { 1686 type Value = V::Value; 1687 deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,1688 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 1689 where 1690 D: Deserializer<'de>, 1691 { 1692 deserializer.deserialize_map(self.visitor) 1693 } 1694 } 1695 1696 /// Avoid having to restate the generic types on `MapDeserializer`. The 1697 /// `Iterator::Item` contains enough information to figure out K and V. 1698 pub trait Pair { 1699 type First; 1700 type Second; split(self) -> (Self::First, Self::Second)1701 fn split(self) -> (Self::First, Self::Second); 1702 } 1703 1704 impl<A, B> Pair for (A, B) { 1705 type First = A; 1706 type Second = B; split(self) -> (A, B)1707 fn split(self) -> (A, B) { 1708 self 1709 } 1710 } 1711 1712 pub type First<T> = <T as Pair>::First; 1713 pub type Second<T> = <T as Pair>::Second; 1714 } 1715