• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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