@@ -11,9 +11,10 @@ use crate::de::{MapAccess, Unexpected};
1111
1212#[ cfg( any( feature = "std" , feature = "alloc" ) ) ]
1313pub use self :: content:: {
14- content_as_str, Content , ContentDeserializer , ContentRefDeserializer , EnumDeserializer ,
15- InternallyTaggedUnitVisitor , TagContentOtherField , TagContentOtherFieldVisitor ,
16- TagOrContentField , TagOrContentFieldVisitor , TaggedContentVisitor , UntaggedUnitVisitor ,
14+ content_as_str, Content , ContentDeserializer , ContentRefDeserializer , ContentVisitor ,
15+ EnumDeserializer , InternallyTaggedUnitVisitor , TagContentOtherField ,
16+ TagContentOtherFieldVisitor , TagOrContentField , TagOrContentFieldVisitor , TaggedContentVisitor ,
17+ UntaggedUnitVisitor ,
1718} ;
1819
1920pub use serde_core:: __private:: InPlaceSeed ;
@@ -212,8 +213,8 @@ mod content {
212213 self , Deserialize , DeserializeSeed , Deserializer , EnumAccess , Expected , IgnoredAny ,
213214 MapAccess , SeqAccess , Unexpected , Visitor ,
214215 } ;
216+ use serde_core:: __private:: size_hint;
215217 pub use serde_core:: __private:: Content ;
216- use serde_core:: __private:: { size_hint, ContentVisitor } ;
217218
218219 pub fn content_as_str < ' a , ' de > ( content : & ' a Content < ' de > ) -> Option < & ' a str > {
219220 match * content {
@@ -283,6 +284,228 @@ mod content {
283284 }
284285 }
285286
287+ pub struct ContentVisitor < ' de > {
288+ value : PhantomData < Content < ' de > > ,
289+ }
290+
291+ impl < ' de > ContentVisitor < ' de > {
292+ pub fn new ( ) -> Self {
293+ ContentVisitor { value : PhantomData }
294+ }
295+ }
296+
297+ impl < ' de > DeserializeSeed < ' de > for ContentVisitor < ' de > {
298+ type Value = Content < ' de > ;
299+
300+ fn deserialize < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
301+ where
302+ D : Deserializer < ' de > ,
303+ {
304+ deserializer. __deserialize_content_v1 ( self )
305+ }
306+ }
307+
308+ impl < ' de > Visitor < ' de > for ContentVisitor < ' de > {
309+ type Value = Content < ' de > ;
310+
311+ fn expecting ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
312+ fmt. write_str ( "any value" )
313+ }
314+
315+ fn visit_bool < F > ( self , value : bool ) -> Result < Self :: Value , F >
316+ where
317+ F : de:: Error ,
318+ {
319+ Ok ( Content :: Bool ( value) )
320+ }
321+
322+ fn visit_i8 < F > ( self , value : i8 ) -> Result < Self :: Value , F >
323+ where
324+ F : de:: Error ,
325+ {
326+ Ok ( Content :: I8 ( value) )
327+ }
328+
329+ fn visit_i16 < F > ( self , value : i16 ) -> Result < Self :: Value , F >
330+ where
331+ F : de:: Error ,
332+ {
333+ Ok ( Content :: I16 ( value) )
334+ }
335+
336+ fn visit_i32 < F > ( self , value : i32 ) -> Result < Self :: Value , F >
337+ where
338+ F : de:: Error ,
339+ {
340+ Ok ( Content :: I32 ( value) )
341+ }
342+
343+ fn visit_i64 < F > ( self , value : i64 ) -> Result < Self :: Value , F >
344+ where
345+ F : de:: Error ,
346+ {
347+ Ok ( Content :: I64 ( value) )
348+ }
349+
350+ fn visit_u8 < F > ( self , value : u8 ) -> Result < Self :: Value , F >
351+ where
352+ F : de:: Error ,
353+ {
354+ Ok ( Content :: U8 ( value) )
355+ }
356+
357+ fn visit_u16 < F > ( self , value : u16 ) -> Result < Self :: Value , F >
358+ where
359+ F : de:: Error ,
360+ {
361+ Ok ( Content :: U16 ( value) )
362+ }
363+
364+ fn visit_u32 < F > ( self , value : u32 ) -> Result < Self :: Value , F >
365+ where
366+ F : de:: Error ,
367+ {
368+ Ok ( Content :: U32 ( value) )
369+ }
370+
371+ fn visit_u64 < F > ( self , value : u64 ) -> Result < Self :: Value , F >
372+ where
373+ F : de:: Error ,
374+ {
375+ Ok ( Content :: U64 ( value) )
376+ }
377+
378+ fn visit_f32 < F > ( self , value : f32 ) -> Result < Self :: Value , F >
379+ where
380+ F : de:: Error ,
381+ {
382+ Ok ( Content :: F32 ( value) )
383+ }
384+
385+ fn visit_f64 < F > ( self , value : f64 ) -> Result < Self :: Value , F >
386+ where
387+ F : de:: Error ,
388+ {
389+ Ok ( Content :: F64 ( value) )
390+ }
391+
392+ fn visit_char < F > ( self , value : char ) -> Result < Self :: Value , F >
393+ where
394+ F : de:: Error ,
395+ {
396+ Ok ( Content :: Char ( value) )
397+ }
398+
399+ fn visit_str < F > ( self , value : & str ) -> Result < Self :: Value , F >
400+ where
401+ F : de:: Error ,
402+ {
403+ Ok ( Content :: String ( value. into ( ) ) )
404+ }
405+
406+ fn visit_borrowed_str < F > ( self , value : & ' de str ) -> Result < Self :: Value , F >
407+ where
408+ F : de:: Error ,
409+ {
410+ Ok ( Content :: Str ( value) )
411+ }
412+
413+ fn visit_string < F > ( self , value : String ) -> Result < Self :: Value , F >
414+ where
415+ F : de:: Error ,
416+ {
417+ Ok ( Content :: String ( value) )
418+ }
419+
420+ fn visit_bytes < F > ( self , value : & [ u8 ] ) -> Result < Self :: Value , F >
421+ where
422+ F : de:: Error ,
423+ {
424+ Ok ( Content :: ByteBuf ( value. into ( ) ) )
425+ }
426+
427+ fn visit_borrowed_bytes < F > ( self , value : & ' de [ u8 ] ) -> Result < Self :: Value , F >
428+ where
429+ F : de:: Error ,
430+ {
431+ Ok ( Content :: Bytes ( value) )
432+ }
433+
434+ fn visit_byte_buf < F > ( self , value : Vec < u8 > ) -> Result < Self :: Value , F >
435+ where
436+ F : de:: Error ,
437+ {
438+ Ok ( Content :: ByteBuf ( value) )
439+ }
440+
441+ fn visit_unit < F > ( self ) -> Result < Self :: Value , F >
442+ where
443+ F : de:: Error ,
444+ {
445+ Ok ( Content :: Unit )
446+ }
447+
448+ fn visit_none < F > ( self ) -> Result < Self :: Value , F >
449+ where
450+ F : de:: Error ,
451+ {
452+ Ok ( Content :: None )
453+ }
454+
455+ fn visit_some < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
456+ where
457+ D : Deserializer < ' de > ,
458+ {
459+ let v = tri ! ( ContentVisitor :: new( ) . deserialize( deserializer) ) ;
460+ Ok ( Content :: Some ( Box :: new ( v) ) )
461+ }
462+
463+ fn visit_newtype_struct < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
464+ where
465+ D : Deserializer < ' de > ,
466+ {
467+ let v = tri ! ( ContentVisitor :: new( ) . deserialize( deserializer) ) ;
468+ Ok ( Content :: Newtype ( Box :: new ( v) ) )
469+ }
470+
471+ fn visit_seq < V > ( self , mut visitor : V ) -> Result < Self :: Value , V :: Error >
472+ where
473+ V : SeqAccess < ' de > ,
474+ {
475+ let mut vec =
476+ Vec :: < Content > :: with_capacity ( size_hint:: cautious :: < Content > ( visitor. size_hint ( ) ) ) ;
477+ while let Some ( e) = tri ! ( visitor. next_element_seed( ContentVisitor :: new( ) ) ) {
478+ vec. push ( e) ;
479+ }
480+ Ok ( Content :: Seq ( vec) )
481+ }
482+
483+ fn visit_map < V > ( self , mut visitor : V ) -> Result < Self :: Value , V :: Error >
484+ where
485+ V : MapAccess < ' de > ,
486+ {
487+ let mut vec =
488+ Vec :: < ( Content , Content ) > :: with_capacity (
489+ size_hint:: cautious :: < ( Content , Content ) > ( visitor. size_hint ( ) ) ,
490+ ) ;
491+ while let Some ( kv) =
492+ tri ! ( visitor. next_entry_seed( ContentVisitor :: new( ) , ContentVisitor :: new( ) ) )
493+ {
494+ vec. push ( kv) ;
495+ }
496+ Ok ( Content :: Map ( vec) )
497+ }
498+
499+ fn visit_enum < V > ( self , _visitor : V ) -> Result < Self :: Value , V :: Error >
500+ where
501+ V : EnumAccess < ' de > ,
502+ {
503+ Err ( de:: Error :: custom (
504+ "untagged and internally tagged enums do not support enum input" ,
505+ ) )
506+ }
507+ }
508+
286509 /// This is the type of the map keys in an internally tagged enum.
287510 ///
288511 /// Not public API.
@@ -622,7 +845,7 @@ mod content {
622845 }
623846 } ;
624847 let rest = de:: value:: SeqAccessDeserializer :: new ( seq) ;
625- Ok ( ( tag, tri ! ( Content :: deserialize( rest) ) ) )
848+ Ok ( ( tag, tri ! ( ContentVisitor :: new ( ) . deserialize( rest) ) ) )
626849 }
627850
628851 fn visit_map < M > ( self , mut map : M ) -> Result < Self :: Value , M :: Error >
@@ -643,7 +866,7 @@ mod content {
643866 tag = Some ( tri ! ( map. next_value( ) ) ) ;
644867 }
645868 TagOrContent :: Content ( k) => {
646- let v = tri ! ( map. next_value ( ) ) ;
869+ let v = tri ! ( map. next_value_seed ( ContentVisitor :: new ( ) ) ) ;
647870 vec. push ( ( k, v) ) ;
648871 }
649872 }
0 commit comments