Add examples for custom (de)serialization (#25)
This commit is contained in:
parent
7d8923a785
commit
553e309a0f
@ -570,3 +570,60 @@ fn de_name_issue_21() {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn de_custom() {
|
||||||
|
#[derive(Default, PartialEq, Debug, YaDeserialize)]
|
||||||
|
struct Date {
|
||||||
|
#[yaserde(rename = "Year")]
|
||||||
|
year: i32,
|
||||||
|
#[yaserde(rename = "Month")]
|
||||||
|
month: i32,
|
||||||
|
#[yaserde(rename = "Day")]
|
||||||
|
day: Day,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default, PartialEq, Debug)]
|
||||||
|
struct Day {
|
||||||
|
value: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl YaDeserialize for Day {
|
||||||
|
fn deserialize<R: Read>(reader: &mut yaserde::de::Deserializer<R>) -> Result<Self, String> {
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
if let xml::reader::XmlEvent::StartElement { name, .. } = reader.peek()?.to_owned() {
|
||||||
|
let expected_name = String::from("Day");
|
||||||
|
if name.local_name != expected_name {
|
||||||
|
return Err(format!(
|
||||||
|
"Wrong StartElement name: {}, expected: {}",
|
||||||
|
name, expected_name
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let _next = reader.next_event();
|
||||||
|
} else {
|
||||||
|
return Err("StartElement missing".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
if let xml::reader::XmlEvent::Characters(text) = reader.peek()?.to_owned() {
|
||||||
|
Ok(Day {
|
||||||
|
value: 2 * i32::from_str(&text).unwrap(),
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Err("Characters missing".to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Date><Year>2020</Year><Month>01</Month><Day>11</Day></Date>";
|
||||||
|
let model: Date = from_str(content).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
model,
|
||||||
|
Date {
|
||||||
|
year: 2020,
|
||||||
|
month: 1,
|
||||||
|
day: Day { value: 11 * 2 }
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
#[macro_use]
|
|
||||||
extern crate log;
|
extern crate log;
|
||||||
extern crate xml;
|
extern crate xml;
|
||||||
extern crate yaserde;
|
extern crate yaserde;
|
||||||
@ -440,3 +439,40 @@ fn ser_name_issue_21() {
|
|||||||
let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><name>something</name></base>";
|
let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><name>something</name></base>";
|
||||||
convert_and_validate!(model, content);
|
convert_and_validate!(model, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ser_custom() {
|
||||||
|
#[derive(Default, PartialEq, Debug, YaSerialize)]
|
||||||
|
struct Date {
|
||||||
|
#[yaserde(rename = "Year")]
|
||||||
|
year: i32,
|
||||||
|
#[yaserde(rename = "Month")]
|
||||||
|
month: i32,
|
||||||
|
#[yaserde(rename = "Day")]
|
||||||
|
day: Day,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default, PartialEq, Debug)]
|
||||||
|
struct Day {
|
||||||
|
value: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl YaSerialize for Day {
|
||||||
|
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>) -> Result<(), String> {
|
||||||
|
let _ret = writer.write(xml::writer::XmlEvent::start_element("DoubleDay"));
|
||||||
|
let _ret = writer.write(xml::writer::XmlEvent::characters(
|
||||||
|
&(self.value * 2).to_string(),
|
||||||
|
));
|
||||||
|
let _ret = writer.write(xml::writer::XmlEvent::end_element());
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let model = Date {
|
||||||
|
year: 2020,
|
||||||
|
month: 1,
|
||||||
|
day: Day { value: 5 },
|
||||||
|
};
|
||||||
|
let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Date><Year>2020</Year><Month>1</Month><DoubleDay>10</DoubleDay></Date>";
|
||||||
|
convert_and_validate!(model, content);
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user