33//! [simple types]: https://www.w3schools.com/xml/el_simpletype.asp
44//! [as defined]: https://www.w3.org/TR/xmlschema11-1/#Simple_Type_Definition
55
6- use crate :: de:: Text ;
6+ use crate :: de:: { Text , TEXT_KEY } ;
77use crate :: encoding:: Decoder ;
88use crate :: errors:: serialize:: DeError ;
99use crate :: escape:: unescape;
1010use crate :: utils:: { trim_xml_spaces, CowRef } ;
1111use memchr:: memchr;
12- use serde:: de:: value:: UnitDeserializer ;
12+ use serde:: de:: value:: { MapDeserializer , SeqAccessDeserializer , UnitDeserializer } ;
1313use serde:: de:: {
1414 DeserializeSeed , Deserializer , EnumAccess , IntoDeserializer , SeqAccess , VariantAccess , Visitor ,
1515} ;
@@ -477,6 +477,17 @@ impl<'de, 'a> SeqAccess<'de> for ListIter<'de, 'a> {
477477 }
478478}
479479
480+ /// serde<=1.0.213 does not implement `IntoDeserializer` for `SeqAccessDeserializer`,
481+ /// which is required for `MapDeserializer`, so implement it for our type
482+ impl < ' de , ' a > IntoDeserializer < ' de , DeError > for ListIter < ' de , ' a > {
483+ type Deserializer = SeqAccessDeserializer < Self > ;
484+
485+ #[ inline]
486+ fn into_deserializer ( self ) -> Self :: Deserializer {
487+ SeqAccessDeserializer :: new ( self )
488+ }
489+ }
490+
480491////////////////////////////////////////////////////////////////////////////////////////////////////
481492
482493/// A deserializer for an xml probably escaped and encoded value of XSD [simple types].
@@ -605,6 +616,19 @@ impl<'de, 'a> SimpleTypeDeserializer<'de, 'a> {
605616 } ,
606617 } )
607618 }
619+
620+ #[ inline]
621+ fn as_seq_access ( & self ) -> Result < ListIter < ' de , ' _ > , DeError > {
622+ let content = match self . decode ( ) ? {
623+ CowRef :: Input ( s) => Content :: Input ( s) ,
624+ CowRef :: Slice ( s) => Content :: Slice ( s) ,
625+ CowRef :: Owned ( s) => Content :: Owned ( s, 0 ) ,
626+ } ;
627+ Ok ( ListIter {
628+ content : Some ( content) ,
629+ escaped : self . escaped ,
630+ } )
631+ }
608632}
609633
610634impl < ' de , ' a > Deserializer < ' de > for SimpleTypeDeserializer < ' de , ' a > {
@@ -685,15 +709,7 @@ impl<'de, 'a> Deserializer<'de> for SimpleTypeDeserializer<'de, 'a> {
685709 where
686710 V : Visitor < ' de > ,
687711 {
688- let content = match self . decode ( ) ? {
689- CowRef :: Input ( s) => Content :: Input ( s) ,
690- CowRef :: Slice ( s) => Content :: Slice ( s) ,
691- CowRef :: Owned ( s) => Content :: Owned ( s, 0 ) ,
692- } ;
693- visitor. visit_seq ( ListIter {
694- content : Some ( content) ,
695- escaped : self . escaped ,
696- } )
712+ visitor. visit_seq ( self . as_seq_access ( ) ?)
697713 }
698714
699715 /// Representation of tuples the same as [sequences][Self::deserialize_seq].
@@ -720,7 +736,22 @@ impl<'de, 'a> Deserializer<'de> for SimpleTypeDeserializer<'de, 'a> {
720736 }
721737
722738 unsupported ! ( deserialize_map) ;
723- unsupported ! ( deserialize_struct( & ' static str , & ' static [ & ' static str ] ) ) ;
739+
740+ fn deserialize_struct < V > (
741+ self ,
742+ _name : & ' static str ,
743+ fields : & ' static [ & ' static str ] ,
744+ visitor : V ,
745+ ) -> Result < V :: Value , Self :: Error >
746+ where
747+ V : Visitor < ' de > ,
748+ {
749+ if fields == [ TEXT_KEY ] {
750+ let seq = self . as_seq_access ( ) ?;
751+ return visitor. visit_map ( MapDeserializer :: new ( std:: iter:: once ( ( TEXT_KEY , seq) ) ) ) ;
752+ }
753+ self . deserialize_str ( visitor)
754+ }
724755
725756 fn deserialize_enum < V > (
726757 self ,
0 commit comments