From 72d61e03f4a9803328582b93cb6a52c9303b20aa Mon Sep 17 00:00:00 2001 From: Ephraim Kunz Date: Wed, 5 May 2021 07:34:38 -0700 Subject: [PATCH] Fix bug where nested structs with the same element names didn't deserialzie properly. --- yaserde/tests/deserializer.rs | 3 +-- yaserde_derive/src/de/expand_struct.rs | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/yaserde/tests/deserializer.rs b/yaserde/tests/deserializer.rs index 2009a5b..b9ad414 100644 --- a/yaserde/tests/deserializer.rs +++ b/yaserde/tests/deserializer.rs @@ -1052,6 +1052,5 @@ fn de_same_field_name_but_some_other_fields_or_something() { }; serialize_and_validate!(model, content); - // TODO fix it - // deserialize_and_validate!(content, model, FooOuter); + deserialize_and_validate!(content, model, FooOuter); } diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index 4c83918..b5aa233 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -367,16 +367,23 @@ pub fn parse( ); match event { ::xml::reader::XmlEvent::StartElement{ref name, ref attributes, ..} => { - match name.local_name.as_str() { - #call_visitors - _ => { - let event = reader.next_event()?; - #write_unused + if depth == 0 && name.local_name == #root { + // Consume root element. We must do this first. In the case it shares a name with a child element, we don't + // want to prematurely match the child element below. + let event = reader.next_event()?; + #write_unused + } else { + match name.local_name.as_str() { + #call_visitors + _ => { + let event = reader.next_event()?; + #write_unused - if depth > 0 { // Don't skip root element - reader.skip_element(|event| { - #write_unused - })?; + if depth > 0 { // Don't skip root element + reader.skip_element(|event| { + #write_unused + })?; + } } } }