Merge pull request #128 from Freax13/fixes

Fix flattened fields
This commit is contained in:
Marc-Antoine ARNAUD 2021-12-16 16:30:55 +01:00 committed by GitHub
commit 6a6ebcc4ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 89 additions and 2 deletions

View File

@ -192,3 +192,88 @@ fn flatten_attribute() {
serialize_and_validate!(model, content);
deserialize_and_validate!(content, model, HtmlText);
}
#[test]
fn flatten_attribute_and_child() {
init();
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
struct Node {
#[yaserde(flatten)]
base: Base,
#[yaserde(child)]
value: StringValue,
}
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
struct Base {
#[yaserde(attribute)]
id: String,
}
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
struct StringValue {
#[yaserde(text)]
string: String,
}
let model = Node {
base: Base {
id: "Foo".to_owned(),
},
value: StringValue {
string: "Bar".to_owned(),
},
};
let content = r#"<Node id="Foo"><value>Bar</value></Node>"#;
serialize_and_validate!(model, content);
deserialize_and_validate!(content, model, Node);
}
#[test]
fn flatten_name_in_unknown_child() {
init();
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
pub struct Node {
#[yaserde(flatten)]
base: Base,
#[yaserde(child)]
value: Value,
}
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
struct Base {
#[yaserde(attribute)]
id: String,
}
#[derive(PartialEq, Debug, YaDeserialize, YaSerialize)]
enum Value {
Foo(FooStruct),
}
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
struct FooStruct {}
impl Default for Value {
fn default() -> Self {
Self::Foo(FooStruct::default())
}
}
let model = Node {
base: Base {
id: "Foo".to_owned(),
},
value: Value::default(),
};
let content = r#"<Node id="Foo"><value><Foo /></value></Node>"#;
serialize_and_validate!(model, content);
let content = r#"<Node id="Foo"><value><SomethingThatDoesntExist><value></value></SomethingThatDoesntExist></value></Node>"#;
deserialize_and_validate!(content, model, Node);
}

View File

@ -66,7 +66,7 @@ pub fn parse(
}
}
::yaserde::__xml::reader::XmlEvent::EndElement { ref name } => {
if name.local_name == named_element {
if name.local_name == named_element && reader.depth() == start_depth + 1 {
break;
}
let _root = reader.next_event();

View File

@ -160,6 +160,8 @@ pub fn parse(
// If substruct's start element found then deserialize substruct
let value = <#struct_name as ::yaserde::YaDeserialize>::deserialize(reader)?;
#value_label #action;
// read EndElement
let _event = reader.next_event()?;
}
}
})
@ -399,7 +401,7 @@ pub fn parse(
depth += 1;
}
::yaserde::__xml::reader::XmlEvent::EndElement { ref name } => {
if name.local_name == named_element {
if name.local_name == named_element && reader.depth() == start_depth + 1 {
#write_unused
break;
}