don't match nested end tags with the same name
This commit is contained in:
parent
d469128a48
commit
5141abaf85
@ -231,3 +231,49 @@ fn flatten_attribute_and_child() {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -401,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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user