From 553e309a0fae23e2b948183da94d9ef6a3da1bd6 Mon Sep 17 00:00:00 2001 From: Dmitry Samoylov Date: Wed, 15 Jan 2020 18:24:28 +0700 Subject: [PATCH] Add examples for custom (de)serialization (#25) --- yaserde/tests/deserializer.rs | 57 +++++++++++++++++++++++++++++++++++ yaserde/tests/serializer.rs | 38 ++++++++++++++++++++++- 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/yaserde/tests/deserializer.rs b/yaserde/tests/deserializer.rs index 5eee501..b250f44 100644 --- a/yaserde/tests/deserializer.rs +++ b/yaserde/tests/deserializer.rs @@ -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(reader: &mut yaserde::de::Deserializer) -> Result { + 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 = "20200111"; + let model: Date = from_str(content).unwrap(); + + assert_eq!( + model, + Date { + year: 2020, + month: 1, + day: Day { value: 11 * 2 } + } + ); +} diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index a1ba1ca..c27e270 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -1,4 +1,3 @@ -#[macro_use] extern crate log; extern crate xml; extern crate yaserde; @@ -440,3 +439,40 @@ fn ser_name_issue_21() { let content = "something"; 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(&self, writer: &mut yaserde::ser::Serializer) -> 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 = "2020110"; + convert_and_validate!(model, content); +}