commit
6a6ebcc4ae
@ -192,3 +192,88 @@ fn flatten_attribute() {
|
|||||||
serialize_and_validate!(model, content);
|
serialize_and_validate!(model, content);
|
||||||
deserialize_and_validate!(content, model, HtmlText);
|
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);
|
||||||
|
}
|
||||||
|
|||||||
@ -66,7 +66,7 @@ pub fn parse(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
::yaserde::__xml::reader::XmlEvent::EndElement { ref name } => {
|
::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;
|
break;
|
||||||
}
|
}
|
||||||
let _root = reader.next_event();
|
let _root = reader.next_event();
|
||||||
|
|||||||
@ -160,6 +160,8 @@ pub fn parse(
|
|||||||
// If substruct's start element found then deserialize substruct
|
// If substruct's start element found then deserialize substruct
|
||||||
let value = <#struct_name as ::yaserde::YaDeserialize>::deserialize(reader)?;
|
let value = <#struct_name as ::yaserde::YaDeserialize>::deserialize(reader)?;
|
||||||
#value_label #action;
|
#value_label #action;
|
||||||
|
// read EndElement
|
||||||
|
let _event = reader.next_event()?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -399,7 +401,7 @@ pub fn parse(
|
|||||||
depth += 1;
|
depth += 1;
|
||||||
}
|
}
|
||||||
::yaserde::__xml::reader::XmlEvent::EndElement { ref name } => {
|
::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
|
#write_unused
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user