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