This commit is contained in:
Dmitry Samoylov 2020-04-06 18:55:59 +07:00
parent d262bc998f
commit 39185ffd03
2 changed files with 66 additions and 5 deletions

View File

@ -887,3 +887,56 @@ fn de_subitem_issue_12_attributes_with_sub() {
}
);
}
#[test]
fn de_same_field_name_sub() {
#[derive(Default, PartialEq, Debug, YaDeserialize)]
pub struct SubStruct {
sub: Option<i32>,
}
#[derive(Default, PartialEq, Debug, YaDeserialize)]
pub struct Struct {
sub: SubStruct,
}
convert_and_validate!("<Struct><sub /></Struct>", Struct, Struct::default());
convert_and_validate!(
"<Struct><sub><sub>42</sub></sub></Struct>",
Struct,
Struct {
sub: SubStruct { sub: Some(42) }
}
);
}
#[test]
fn de_same_field_name_sub_sub() {
#[derive(Default, PartialEq, Debug, YaDeserialize)]
pub struct SubSubStruct {
sub: i32,
}
#[derive(Default, PartialEq, Debug, YaDeserialize)]
pub struct SubStruct {
sub: Option<SubSubStruct>,
}
#[derive(Default, PartialEq, Debug, YaDeserialize)]
pub struct Struct {
sub: SubStruct,
}
convert_and_validate!("<Struct><sub /></Struct>", Struct, Struct::default());
convert_and_validate!(
"<Struct><sub><sub><sub>42</sub></sub></sub></Struct>",
Struct,
Struct {
sub: SubStruct {
sub: Some(SubSubStruct { sub: 42 })
}
}
);
}

View File

@ -179,9 +179,15 @@ pub fn parse(
let visit_struct = |struct_name: syn::Path, action: TokenStream| {
Some(quote! {
#label_name => {
let value = #struct_name::deserialize(reader)?;
#value_label #action;
let _root = reader.next_event();
if depth == 0 {
// Don't count current struct's StartElement as substruct's StartElement
let _root = reader.next_event();
}
if let Ok(XmlEvent::StartElement { .. }) = reader.peek() {
// If substruct's start element found then deserialize substruct
let value = #struct_name::deserialize(reader)?;
#value_label #action;
}
}
})
};
@ -503,8 +509,10 @@ fn build_call_visitor(
}
let result = reader.read_inner_value::<#field_type, _>(|reader| {
if let Ok(XmlEvent::Characters(s)) = reader.next_event() {
visitor.#visitor(&s)
if let Ok(XmlEvent::Characters(s)) = reader.peek() {
let val = visitor.#visitor(&s);
let _event = reader.next_event()?;
val
} else {
Err(format!("unable to parse content for {}", #label_name))
}