use quick_xml::events::{BytesStart, Event}; use std::io::BufRead; pub mod de; pub use de::XmlDeError; pub use de::XmlDeserialize; pub use de::XmlRoot; impl XmlDeserialize for Option { fn deserialize( reader: &mut quick_xml::NsReader, start: &BytesStart, empty: bool, ) -> Result { Ok(Some(T::deserialize(reader, start, empty)?)) } } pub struct Unit; impl XmlDeserialize for Unit { fn deserialize( reader: &mut quick_xml::NsReader, start: &BytesStart, empty: bool, ) -> Result { if empty { return Ok(Unit); } let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf)? { Event::End(e) if e.name() == start.name() => return Ok(Unit), Event::Eof => return Err(XmlDeError::Eof), _ => {} }; } } } impl XmlDeserialize for String { fn deserialize( reader: &mut quick_xml::NsReader, start: &BytesStart, empty: bool, ) -> Result { if empty { return Ok(String::new()); } let mut content = String::new(); let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf)? { Event::End(e) if e.name() == start.name() => { break; } Event::Eof => return Err(XmlDeError::Eof), Event::Text(text) => { content.push_str(&text.unescape()?); } _a => return Err(XmlDeError::UnknownError), }; } Ok(content) } }