1 use std::fmt; 2 3 use serde::ser::{ 4 SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple, 5 SerializeTupleStruct, SerializeTupleVariant, 6 }; 7 use serde::{Deserialize, Deserializer, Serialize, Serializer}; 8 9 #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] 10 pub struct Readable<T: ?Sized>(T); 11 #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] 12 pub struct Compact<T: ?Sized>(T); 13 14 /// Trait to determine whether a value is represented in human-readable or 15 /// compact form. 16 /// 17 /// ```edition2018 18 /// use serde::{Deserialize, Deserializer, Serialize, Serializer}; 19 /// use serde_test::{assert_tokens, Configure, Token}; 20 /// 21 /// #[derive(Debug, PartialEq)] 22 /// struct Example(u8, u8); 23 /// 24 /// impl Serialize for Example { 25 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 26 /// where 27 /// S: Serializer, 28 /// { 29 /// if serializer.is_human_readable() { 30 /// format!("{}.{}", self.0, self.1).serialize(serializer) 31 /// } else { 32 /// (self.0, self.1).serialize(serializer) 33 /// } 34 /// } 35 /// } 36 /// 37 /// impl<'de> Deserialize<'de> for Example { 38 /// fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> 39 /// where 40 /// D: Deserializer<'de>, 41 /// { 42 /// use serde::de::Error; 43 /// if deserializer.is_human_readable() { 44 /// let s = String::deserialize(deserializer)?; 45 /// let parts: Vec<_> = s.split('.').collect(); 46 /// Ok(Example( 47 /// parts[0].parse().map_err(D::Error::custom)?, 48 /// parts[1].parse().map_err(D::Error::custom)?, 49 /// )) 50 /// } else { 51 /// let (x, y) = Deserialize::deserialize(deserializer)?; 52 /// Ok(Example(x, y)) 53 /// } 54 /// } 55 /// } 56 /// 57 /// fn main() { 58 /// assert_tokens( 59 /// &Example(1, 0).compact(), 60 /// &[ 61 /// Token::Tuple { len: 2 }, 62 /// Token::U8(1), 63 /// Token::U8(0), 64 /// Token::TupleEnd, 65 /// ], 66 /// ); 67 /// assert_tokens(&Example(1, 0).readable(), &[Token::Str("1.0")]); 68 /// } 69 /// ``` 70 pub trait Configure { 71 /// Marks `self` as using `is_human_readable == true` readable(self) -> Readable<Self> where Self: Sized,72 fn readable(self) -> Readable<Self> 73 where 74 Self: Sized, 75 { 76 Readable(self) 77 } 78 /// Marks `self` as using `is_human_readable == false` compact(self) -> Compact<Self> where Self: Sized,79 fn compact(self) -> Compact<Self> 80 where 81 Self: Sized, 82 { 83 Compact(self) 84 } 85 } 86 87 impl<T: ?Sized> Configure for T {} 88 89 impl<T: ?Sized> Serialize for Readable<T> 90 where 91 T: Serialize, 92 { 93 #[inline] serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,94 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 95 where 96 S: Serializer, 97 { 98 self.0.serialize(Readable(serializer)) 99 } 100 } 101 impl<T: ?Sized> Serialize for Compact<T> 102 where 103 T: Serialize, 104 { 105 #[inline] serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,106 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 107 where 108 S: Serializer, 109 { 110 self.0.serialize(Compact(serializer)) 111 } 112 } 113 impl<'de, T> Deserialize<'de> for Readable<T> 114 where 115 T: Deserialize<'de>, 116 { deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,117 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> 118 where 119 D: Deserializer<'de>, 120 { 121 T::deserialize(Readable(deserializer)).map(Readable) 122 } 123 } 124 impl<'de, T> Deserialize<'de> for Compact<T> 125 where 126 T: Deserialize<'de>, 127 { deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,128 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> 129 where 130 D: Deserializer<'de>, 131 { 132 T::deserialize(Compact(deserializer)).map(Compact) 133 } 134 } 135 136 impl<'de, T> DeserializeSeed<'de> for Readable<T> 137 where 138 T: DeserializeSeed<'de>, 139 { 140 type Value = T::Value; 141 deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,142 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 143 where 144 D: Deserializer<'de>, 145 { 146 self.0.deserialize(Readable(deserializer)) 147 } 148 } 149 impl<'de, T> DeserializeSeed<'de> for Compact<T> 150 where 151 T: DeserializeSeed<'de>, 152 { 153 type Value = T::Value; 154 deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer<'de>,155 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 156 where 157 D: Deserializer<'de>, 158 { 159 self.0.deserialize(Compact(deserializer)) 160 } 161 } 162 163 macro_rules! forward_method { 164 ($name: ident (self $(, $arg: ident : $arg_type: ty)* ) -> $return_type: ty) => { 165 fn $name (self $(, $arg : $arg_type)* ) -> $return_type { 166 (self.0).$name( $($arg),* ) 167 } 168 }; 169 } 170 171 macro_rules! forward_serialize_methods { 172 ( $( $name: ident $arg_type: ty ),* ) => { 173 $( 174 forward_method!($name(self, v : $arg_type) -> Result<Self::Ok, Self::Error>); 175 )* 176 }; 177 } 178 179 macro_rules! impl_serializer { 180 ($wrapper:ident, $is_human_readable:expr) => { 181 impl<S> Serializer for $wrapper<S> 182 where 183 S: Serializer, 184 { 185 type Ok = S::Ok; 186 type Error = S::Error; 187 188 type SerializeSeq = $wrapper<S::SerializeSeq>; 189 type SerializeTuple = $wrapper<S::SerializeTuple>; 190 type SerializeTupleStruct = $wrapper<S::SerializeTupleStruct>; 191 type SerializeTupleVariant = $wrapper<S::SerializeTupleVariant>; 192 type SerializeMap = $wrapper<S::SerializeMap>; 193 type SerializeStruct = $wrapper<S::SerializeStruct>; 194 type SerializeStructVariant = $wrapper<S::SerializeStructVariant>; 195 196 fn is_human_readable(&self) -> bool { 197 $is_human_readable 198 } 199 200 forward_serialize_methods! { 201 serialize_bool bool, 202 serialize_i8 i8, 203 serialize_i16 i16, 204 serialize_i32 i32, 205 serialize_i64 i64, 206 serialize_u8 u8, 207 serialize_u16 u16, 208 serialize_u32 u32, 209 serialize_u64 u64, 210 serialize_f32 f32, 211 serialize_f64 f64, 212 serialize_char char, 213 serialize_str &str, 214 serialize_bytes &[u8], 215 serialize_unit_struct &'static str 216 217 } 218 219 fn serialize_unit(self) -> Result<S::Ok, S::Error> { 220 self.0.serialize_unit() 221 } 222 223 fn serialize_unit_variant( 224 self, 225 name: &'static str, 226 variant_index: u32, 227 variant: &'static str, 228 ) -> Result<S::Ok, S::Error> { 229 self.0.serialize_unit_variant(name, variant_index, variant) 230 } 231 232 fn serialize_newtype_struct<T: ?Sized>( 233 self, 234 name: &'static str, 235 value: &T, 236 ) -> Result<S::Ok, S::Error> 237 where 238 T: Serialize, 239 { 240 self.0.serialize_newtype_struct(name, &$wrapper(value)) 241 } 242 243 fn serialize_newtype_variant<T: ?Sized>( 244 self, 245 name: &'static str, 246 variant_index: u32, 247 variant: &'static str, 248 value: &T, 249 ) -> Result<S::Ok, S::Error> 250 where 251 T: Serialize, 252 { 253 self.0 254 .serialize_newtype_variant(name, variant_index, variant, &$wrapper(value)) 255 } 256 257 fn serialize_none(self) -> Result<S::Ok, Self::Error> { 258 self.0.serialize_none() 259 } 260 261 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<S::Ok, Self::Error> 262 where 263 T: Serialize, 264 { 265 self.0.serialize_some(&$wrapper(value)) 266 } 267 268 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { 269 self.0.serialize_seq(len).map($wrapper) 270 } 271 272 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> { 273 self.0.serialize_tuple(len).map($wrapper) 274 } 275 276 fn serialize_tuple_struct( 277 self, 278 name: &'static str, 279 len: usize, 280 ) -> Result<Self::SerializeTupleStruct, Self::Error> { 281 self.0.serialize_tuple_struct(name, len).map($wrapper) 282 } 283 284 fn serialize_tuple_variant( 285 self, 286 name: &'static str, 287 variant_index: u32, 288 variant: &'static str, 289 len: usize, 290 ) -> Result<Self::SerializeTupleVariant, Self::Error> { 291 self.0 292 .serialize_tuple_variant(name, variant_index, variant, len) 293 .map($wrapper) 294 } 295 296 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { 297 self.0.serialize_map(len).map($wrapper) 298 } 299 300 fn serialize_struct( 301 self, 302 name: &'static str, 303 len: usize, 304 ) -> Result<Self::SerializeStruct, Self::Error> { 305 self.0.serialize_struct(name, len).map($wrapper) 306 } 307 308 fn serialize_struct_variant( 309 self, 310 name: &'static str, 311 variant_index: u32, 312 variant: &'static str, 313 len: usize, 314 ) -> Result<Self::SerializeStructVariant, Self::Error> { 315 self.0 316 .serialize_struct_variant(name, variant_index, variant, len) 317 .map($wrapper) 318 } 319 } 320 321 impl<S> SerializeSeq for $wrapper<S> 322 where 323 S: SerializeSeq, 324 { 325 type Ok = S::Ok; 326 type Error = S::Error; 327 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), S::Error> 328 where 329 T: Serialize, 330 { 331 self.0.serialize_element(&$wrapper(value)) 332 } 333 fn end(self) -> Result<S::Ok, S::Error> { 334 self.0.end() 335 } 336 } 337 338 impl<S> SerializeTuple for $wrapper<S> 339 where 340 S: SerializeTuple, 341 { 342 type Ok = S::Ok; 343 type Error = S::Error; 344 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), S::Error> 345 where 346 T: Serialize, 347 { 348 self.0.serialize_element(&$wrapper(value)) 349 } 350 fn end(self) -> Result<S::Ok, S::Error> { 351 self.0.end() 352 } 353 } 354 355 impl<S> SerializeTupleStruct for $wrapper<S> 356 where 357 S: SerializeTupleStruct, 358 { 359 type Ok = S::Ok; 360 type Error = S::Error; 361 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), S::Error> 362 where 363 T: Serialize, 364 { 365 self.0.serialize_field(&$wrapper(value)) 366 } 367 fn end(self) -> Result<S::Ok, S::Error> { 368 self.0.end() 369 } 370 } 371 372 impl<S> SerializeTupleVariant for $wrapper<S> 373 where 374 S: SerializeTupleVariant, 375 { 376 type Ok = S::Ok; 377 type Error = S::Error; 378 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), S::Error> 379 where 380 T: Serialize, 381 { 382 self.0.serialize_field(&$wrapper(value)) 383 } 384 fn end(self) -> Result<S::Ok, S::Error> { 385 self.0.end() 386 } 387 } 388 389 impl<S> SerializeMap for $wrapper<S> 390 where 391 S: SerializeMap, 392 { 393 type Ok = S::Ok; 394 type Error = S::Error; 395 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), S::Error> 396 where 397 T: Serialize, 398 { 399 self.0.serialize_key(&$wrapper(key)) 400 } 401 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), S::Error> 402 where 403 T: Serialize, 404 { 405 self.0.serialize_value(&$wrapper(value)) 406 } 407 fn serialize_entry<K: ?Sized, V: ?Sized>( 408 &mut self, 409 key: &K, 410 value: &V, 411 ) -> Result<(), S::Error> 412 where 413 K: Serialize, 414 V: Serialize, 415 { 416 self.0.serialize_entry(key, &$wrapper(value)) 417 } 418 fn end(self) -> Result<S::Ok, S::Error> { 419 self.0.end() 420 } 421 } 422 423 impl<S> SerializeStruct for $wrapper<S> 424 where 425 S: SerializeStruct, 426 { 427 type Ok = S::Ok; 428 type Error = S::Error; 429 fn serialize_field<T: ?Sized>( 430 &mut self, 431 name: &'static str, 432 field: &T, 433 ) -> Result<(), S::Error> 434 where 435 T: Serialize, 436 { 437 self.0.serialize_field(name, &$wrapper(field)) 438 } 439 fn end(self) -> Result<S::Ok, S::Error> { 440 self.0.end() 441 } 442 } 443 444 impl<S> SerializeStructVariant for $wrapper<S> 445 where 446 S: SerializeStructVariant, 447 { 448 type Ok = S::Ok; 449 type Error = S::Error; 450 fn serialize_field<T: ?Sized>( 451 &mut self, 452 name: &'static str, 453 field: &T, 454 ) -> Result<(), S::Error> 455 where 456 T: Serialize, 457 { 458 self.0.serialize_field(name, &$wrapper(field)) 459 } 460 fn end(self) -> Result<S::Ok, S::Error> { 461 self.0.end() 462 } 463 } 464 }; 465 } 466 467 impl_serializer!(Readable, true); 468 impl_serializer!(Compact, false); 469 470 use serde::de::{DeserializeSeed, EnumAccess, Error, MapAccess, SeqAccess, VariantAccess, Visitor}; 471 472 macro_rules! forward_deserialize_methods { 473 ( $wrapper : ident ( $( $name: ident ),* ) ) => { 474 $( 475 fn $name<V>(self, visitor: V) -> Result<V::Value, D::Error> 476 where 477 V: Visitor<'de>, 478 { 479 (self.0).$name($wrapper(visitor)) 480 } 481 )* 482 }; 483 } 484 485 macro_rules! impl_deserializer { 486 ($wrapper:ident, $is_human_readable:expr) => { 487 impl<'de, D> Deserializer<'de> for $wrapper<D> 488 where 489 D: Deserializer<'de>, 490 { 491 type Error = D::Error; 492 493 forward_deserialize_methods! { 494 $wrapper ( 495 deserialize_any, 496 deserialize_bool, 497 deserialize_u8, 498 deserialize_u16, 499 deserialize_u32, 500 deserialize_u64, 501 deserialize_i8, 502 deserialize_i16, 503 deserialize_i32, 504 deserialize_i64, 505 deserialize_f32, 506 deserialize_f64, 507 deserialize_char, 508 deserialize_str, 509 deserialize_string, 510 deserialize_bytes, 511 deserialize_byte_buf, 512 deserialize_option, 513 deserialize_unit, 514 deserialize_seq, 515 deserialize_map, 516 deserialize_identifier, 517 deserialize_ignored_any 518 ) 519 } 520 521 fn deserialize_unit_struct<V>( 522 self, 523 name: &'static str, 524 visitor: V, 525 ) -> Result<V::Value, D::Error> 526 where 527 V: Visitor<'de>, 528 { 529 self.0.deserialize_unit_struct(name, $wrapper(visitor)) 530 } 531 fn deserialize_newtype_struct<V>( 532 self, 533 name: &'static str, 534 visitor: V, 535 ) -> Result<V::Value, D::Error> 536 where 537 V: Visitor<'de>, 538 { 539 self.0.deserialize_newtype_struct(name, $wrapper(visitor)) 540 } 541 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, D::Error> 542 where 543 V: Visitor<'de>, 544 { 545 self.0.deserialize_tuple(len, $wrapper(visitor)) 546 } 547 fn deserialize_tuple_struct<V>( 548 self, 549 name: &'static str, 550 len: usize, 551 visitor: V, 552 ) -> Result<V::Value, D::Error> 553 where 554 V: Visitor<'de>, 555 { 556 self.0 557 .deserialize_tuple_struct(name, len, $wrapper(visitor)) 558 } 559 fn deserialize_struct<V>( 560 self, 561 name: &'static str, 562 fields: &'static [&'static str], 563 visitor: V, 564 ) -> Result<V::Value, D::Error> 565 where 566 V: Visitor<'de>, 567 { 568 self.0.deserialize_struct(name, fields, $wrapper(visitor)) 569 } 570 fn deserialize_enum<V>( 571 self, 572 name: &'static str, 573 variants: &'static [&'static str], 574 visitor: V, 575 ) -> Result<V::Value, D::Error> 576 where 577 V: Visitor<'de>, 578 { 579 self.0.deserialize_enum(name, variants, $wrapper(visitor)) 580 } 581 582 fn is_human_readable(&self) -> bool { 583 $is_human_readable 584 } 585 } 586 587 impl<'de, D> Visitor<'de> for $wrapper<D> 588 where 589 D: Visitor<'de>, 590 { 591 type Value = D::Value; 592 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 593 self.0.expecting(formatter) 594 } 595 fn visit_bool<E>(self, v: bool) -> Result<D::Value, E> 596 where 597 E: Error, 598 { 599 self.0.visit_bool(v) 600 } 601 fn visit_i8<E>(self, v: i8) -> Result<D::Value, E> 602 where 603 E: Error, 604 { 605 self.0.visit_i8(v) 606 } 607 fn visit_i16<E>(self, v: i16) -> Result<D::Value, E> 608 where 609 E: Error, 610 { 611 self.0.visit_i16(v) 612 } 613 fn visit_i32<E>(self, v: i32) -> Result<D::Value, E> 614 where 615 E: Error, 616 { 617 self.0.visit_i32(v) 618 } 619 fn visit_i64<E>(self, v: i64) -> Result<D::Value, E> 620 where 621 E: Error, 622 { 623 self.0.visit_i64(v) 624 } 625 fn visit_u8<E>(self, v: u8) -> Result<D::Value, E> 626 where 627 E: Error, 628 { 629 self.0.visit_u8(v) 630 } 631 fn visit_u16<E>(self, v: u16) -> Result<D::Value, E> 632 where 633 E: Error, 634 { 635 self.0.visit_u16(v) 636 } 637 fn visit_u32<E>(self, v: u32) -> Result<D::Value, E> 638 where 639 E: Error, 640 { 641 self.0.visit_u32(v) 642 } 643 fn visit_u64<E>(self, v: u64) -> Result<D::Value, E> 644 where 645 E: Error, 646 { 647 self.0.visit_u64(v) 648 } 649 fn visit_f32<E>(self, v: f32) -> Result<D::Value, E> 650 where 651 E: Error, 652 { 653 self.0.visit_f32(v) 654 } 655 fn visit_f64<E>(self, v: f64) -> Result<D::Value, E> 656 where 657 E: Error, 658 { 659 self.0.visit_f64(v) 660 } 661 fn visit_char<E>(self, v: char) -> Result<D::Value, E> 662 where 663 E: Error, 664 { 665 self.0.visit_char(v) 666 } 667 fn visit_str<E>(self, v: &str) -> Result<D::Value, E> 668 where 669 E: Error, 670 { 671 self.0.visit_str(v) 672 } 673 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<D::Value, E> 674 where 675 E: Error, 676 { 677 self.0.visit_borrowed_str(v) 678 } 679 fn visit_string<E>(self, v: String) -> Result<D::Value, E> 680 where 681 E: Error, 682 { 683 self.0.visit_string(v) 684 } 685 fn visit_bytes<E>(self, v: &[u8]) -> Result<D::Value, E> 686 where 687 E: Error, 688 { 689 self.0.visit_bytes(v) 690 } 691 fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<D::Value, E> 692 where 693 E: Error, 694 { 695 self.0.visit_borrowed_bytes(v) 696 } 697 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<D::Value, E> 698 where 699 E: Error, 700 { 701 self.0.visit_byte_buf(v) 702 } 703 fn visit_none<E>(self) -> Result<D::Value, E> 704 where 705 E: Error, 706 { 707 self.0.visit_none() 708 } 709 fn visit_some<D2>(self, deserializer: D2) -> Result<Self::Value, D2::Error> 710 where 711 D2: Deserializer<'de>, 712 { 713 self.0.visit_some($wrapper(deserializer)) 714 } 715 fn visit_unit<E>(self) -> Result<D::Value, E> 716 where 717 E: Error, 718 { 719 self.0.visit_unit() 720 } 721 fn visit_newtype_struct<D2>(self, deserializer: D2) -> Result<Self::Value, D2::Error> 722 where 723 D2: Deserializer<'de>, 724 { 725 self.0.visit_newtype_struct($wrapper(deserializer)) 726 } 727 fn visit_seq<V>(self, seq: V) -> Result<D::Value, V::Error> 728 where 729 V: SeqAccess<'de>, 730 { 731 self.0.visit_seq($wrapper(seq)) 732 } 733 fn visit_map<V>(self, map: V) -> Result<D::Value, V::Error> 734 where 735 V: MapAccess<'de>, 736 { 737 self.0.visit_map($wrapper(map)) 738 } 739 fn visit_enum<V>(self, data: V) -> Result<D::Value, V::Error> 740 where 741 V: EnumAccess<'de>, 742 { 743 self.0.visit_enum($wrapper(data)) 744 } 745 } 746 747 impl<'de, D> SeqAccess<'de> for $wrapper<D> 748 where 749 D: SeqAccess<'de>, 750 { 751 type Error = D::Error; 752 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, D::Error> 753 where 754 T: DeserializeSeed<'de>, 755 { 756 self.0.next_element_seed($wrapper(seed)) 757 } 758 fn size_hint(&self) -> Option<usize> { 759 self.0.size_hint() 760 } 761 } 762 763 impl<'de, D> MapAccess<'de> for $wrapper<D> 764 where 765 D: MapAccess<'de>, 766 { 767 type Error = D::Error; 768 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, D::Error> 769 where 770 K: DeserializeSeed<'de>, 771 { 772 self.0.next_key_seed($wrapper(seed)) 773 } 774 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, D::Error> 775 where 776 V: DeserializeSeed<'de>, 777 { 778 self.0.next_value_seed($wrapper(seed)) 779 } 780 fn next_entry_seed<K, V>( 781 &mut self, 782 kseed: K, 783 vseed: V, 784 ) -> Result<Option<(K::Value, V::Value)>, D::Error> 785 where 786 K: DeserializeSeed<'de>, 787 V: DeserializeSeed<'de>, 788 { 789 self.0.next_entry_seed($wrapper(kseed), $wrapper(vseed)) 790 } 791 fn size_hint(&self) -> Option<usize> { 792 self.0.size_hint() 793 } 794 } 795 796 impl<'de, D> EnumAccess<'de> for $wrapper<D> 797 where 798 D: EnumAccess<'de>, 799 { 800 type Error = D::Error; 801 type Variant = $wrapper<D::Variant>; 802 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> 803 where 804 V: DeserializeSeed<'de>, 805 { 806 self.0 807 .variant_seed($wrapper(seed)) 808 .map(|(value, variant)| (value, $wrapper(variant))) 809 } 810 } 811 812 impl<'de, D> VariantAccess<'de> for $wrapper<D> 813 where 814 D: VariantAccess<'de>, 815 { 816 type Error = D::Error; 817 fn unit_variant(self) -> Result<(), D::Error> { 818 self.0.unit_variant() 819 } 820 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, D::Error> 821 where 822 T: DeserializeSeed<'de>, 823 { 824 self.0.newtype_variant_seed($wrapper(seed)) 825 } 826 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, D::Error> 827 where 828 V: Visitor<'de>, 829 { 830 self.0.tuple_variant(len, $wrapper(visitor)) 831 } 832 fn struct_variant<V>( 833 self, 834 fields: &'static [&'static str], 835 visitor: V, 836 ) -> Result<V::Value, D::Error> 837 where 838 V: Visitor<'de>, 839 { 840 self.0.struct_variant(fields, $wrapper(visitor)) 841 } 842 } 843 }; 844 } 845 846 impl_deserializer!(Readable, true); 847 impl_deserializer!(Compact, false); 848