@@ -188,7 +188,7 @@ where
188188 /// ```
189189 has_value_field : bool ,
190190 /// list of fields yet to unflatten (defined as starting with $unflatten=)
191- unflatten_fields : Vec < & ' static [ u8 ] > ,
191+ unflatten_fields : Vec < & ' static str > ,
192192}
193193
194194impl < ' de , ' a , R > MapAccess < ' de , ' a , R >
@@ -211,7 +211,7 @@ where
211211 unflatten_fields : fields
212212 . iter ( )
213213 . filter ( |f| f. starts_with ( UNFLATTEN_PREFIX ) )
214- . map ( |f| f. as_bytes ( ) )
214+ . map ( |& f| f)
215215 . collect ( ) ,
216216 } )
217217 }
@@ -232,15 +232,12 @@ where
232232 // FIXME: There error positions counted from the start of tag name - need global position
233233 let slice = & self . start . buf ;
234234
235- if let Some ( a) = self . iter . next ( slice) . transpose ( ) ? {
235+ if let Some ( a) = self . iter . next ( slice. as_bytes ( ) ) . transpose ( ) ? {
236236 // try getting map from attributes (key= "value")
237237 let ( key, value) = a. into ( ) ;
238238 self . source = ValueSource :: Attribute ( value. unwrap_or_default ( ) ) ;
239- seed. deserialize ( EscapedDeserializer :: new (
240- Cow :: Borrowed ( std:: str:: from_utf8 ( & slice[ key] ) . expect ( "fixme dalley" ) ) ,
241- false ,
242- ) )
243- . map ( Some )
239+ seed. deserialize ( EscapedDeserializer :: new ( Cow :: Borrowed ( & slice[ key] ) , false ) )
240+ . map ( Some )
244241 } else {
245242 // try getting from events (<key>value</key>)
246243 match self . de . peek ( ) ? {
@@ -273,26 +270,27 @@ where
273270 }
274271 DeEvent :: Start ( e) => {
275272 self . source = ValueSource :: Nested ;
276- let key =
277- if let Some ( p) = self . unflatten_fields . iter ( ) . position ( |f| {
278- e. name ( ) . as_ref ( ) . as_bytes ( ) == & f[ UNFLATTEN_PREFIX . len ( ) ..]
279- } ) {
280- // Used to deserialize elements, like:
281- // <root>
282- // <xxx>test</xxx>
283- // </root>
284- //
285- // into
286- //
287- // struct Root {
288- // #[serde(rename = "$unflatten=xxx")]
289- // xxx: String,
290- // }
291- seed. deserialize ( self . unflatten_fields . remove ( p) . into_deserializer ( ) )
292- } else {
293- let name = Cow :: Borrowed ( e. local_name ( ) . into_inner ( ) ) ;
294- seed. deserialize ( EscapedDeserializer :: new ( name, false ) )
295- } ;
273+ let key = if let Some ( p) = self
274+ . unflatten_fields
275+ . iter ( )
276+ . position ( |f| e. name ( ) . as_ref ( ) == & f[ UNFLATTEN_PREFIX . len ( ) ..] )
277+ {
278+ // Used to deserialize elements, like:
279+ // <root>
280+ // <xxx>test</xxx>
281+ // </root>
282+ //
283+ // into
284+ //
285+ // struct Root {
286+ // #[serde(rename = "$unflatten=xxx")]
287+ // xxx: String,
288+ // }
289+ seed. deserialize ( self . unflatten_fields . remove ( p) . into_deserializer ( ) )
290+ } else {
291+ let name = Cow :: Borrowed ( e. local_name ( ) . into_inner ( ) ) ;
292+ seed. deserialize ( EscapedDeserializer :: new ( name, false ) )
293+ } ;
296294 key. map ( Some )
297295 }
298296 // Stop iteration after reaching a closing tag
@@ -315,7 +313,6 @@ where
315313 & self . start . buf ,
316314 value,
317315 true ,
318- self . de . reader . decoder ( ) ,
319316 ) ) ,
320317 // This arm processes the following XML shape:
321318 // <any-tag>
@@ -327,16 +324,12 @@ where
327324 // of that events)
328325 // This case are checked by "xml_schema_lists::element" tests in tests/serde-de.rs
329326 ValueSource :: Text => match self . de . next ( ) ? {
330- DeEvent :: Text ( e) => seed. deserialize ( SimpleTypeDeserializer :: from_cow (
331- e. into_inner ( ) ,
332- true ,
333- self . de . reader . decoder ( ) ,
334- ) ) ,
335- DeEvent :: CData ( e) => seed. deserialize ( SimpleTypeDeserializer :: from_cow (
336- e. into_inner ( ) ,
337- false ,
338- self . de . reader . decoder ( ) ,
339- ) ) ,
327+ DeEvent :: Text ( e) => {
328+ seed. deserialize ( SimpleTypeDeserializer :: from_cow ( e. into_inner ( ) , true ) )
329+ }
330+ DeEvent :: CData ( e) => {
331+ seed. deserialize ( SimpleTypeDeserializer :: from_cow ( e. into_inner ( ) , false ) )
332+ }
340333 // SAFETY: We set `Text` only when we seen `Text` or `CData`
341334 _ => unreachable ! ( ) ,
342335 } ,
@@ -722,32 +715,20 @@ where
722715 // Comment to prevent auto-formatting and keep Text and Cdata similar
723716 e. into_inner ( ) ,
724717 true ,
725- self . map . de . reader . decoder ( ) ,
726- )
727- . deserialize_seq ( visitor) ,
728- DeEvent :: CData ( e) => SimpleTypeDeserializer :: from_cow (
729- e. into_inner ( ) ,
730- false ,
731- self . map . de . reader . decoder ( ) ,
732718 )
733719 . deserialize_seq ( visitor) ,
720+ DeEvent :: CData ( e) => {
721+ SimpleTypeDeserializer :: from_cow ( e. into_inner ( ) , false ) . deserialize_seq ( visitor)
722+ }
734723 // This is a sequence element. We cannot treat it as another flatten
735724 // sequence if type will require `deserialize_seq` We instead forward
736725 // it to `xs:simpleType` implementation
737726 DeEvent :: Start ( e) => {
738727 let value = match self . map . de . next ( ) ? {
739- DeEvent :: Text ( e) => SimpleTypeDeserializer :: from_cow (
740- e. into_inner ( ) ,
741- true ,
742- self . map . de . reader . decoder ( ) ,
743- )
744- . deserialize_seq ( visitor) ,
745- DeEvent :: CData ( e) => SimpleTypeDeserializer :: from_cow (
746- e. into_inner ( ) ,
747- false ,
748- self . map . de . reader . decoder ( ) ,
749- )
750- . deserialize_seq ( visitor) ,
728+ DeEvent :: Text ( e) => SimpleTypeDeserializer :: from_cow ( e. into_inner ( ) , true )
729+ . deserialize_seq ( visitor) ,
730+ DeEvent :: CData ( e) => SimpleTypeDeserializer :: from_cow ( e. into_inner ( ) , false )
731+ . deserialize_seq ( visitor) ,
751732 e => Err ( DeError :: Custom ( format ! ( "Unsupported event {:?}" , e) ) ) ,
752733 } ;
753734 // TODO: May be assert that here we expect only matching closing tag?
0 commit comments