xavier_internal/deserialize/
declaration.rs

1use quick_xml::events::{BytesDecl, Event};
2use quick_xml::Reader;
3use crate::deserialize::error::PError;
4
5#[macro_export]
6macro_rules! declaration {
7    ($expr:expr) => { xavier::deserialize::declaration::parse($expr) };
8}
9
10pub fn parse(xml: &str) -> Result<(String, Option<String>, Option<String>), PError> {
11    let mut reader = Reader::from_str(xml);
12    loop {
13        match reader.read_event() {
14            Err(error) => { return Err(PError::new(&format!("Error at position {}: {:?}", reader.buffer_position(), error))) },
15            Ok(Event::Eof) => { break },
16            Ok(Event::Start(_)) => { break },
17            Ok(Event::End(_)) => {},
18            Ok(Event::Empty(_)) => {},
19            Ok(Event::Decl(event)) => { return Ok(event_object(event)?) },
20            Ok(Event::PI(_)) => {},
21            Ok(Event::DocType(_)) => {},
22            Ok(Event::Text(_)) => {},
23            Ok(Event::Comment(_)) => {},
24            Ok(Event::CData(_)) => {},
25        };
26    };
27    Err(PError::new("Declaration not found!"))
28}
29fn event_object(event: BytesDecl) -> Result<(String, Option<String>, Option<String>), PError> {
30
31    let version = String::from_utf8(event.version()?.to_vec())?;
32
33    let encoding = if let Some(encoding) = event.encoding() {
34        Some(String::from_utf8(encoding?.to_vec())?)
35    } else {
36        None
37    };
38
39    let standalone = if let Some(standalone) = event.standalone() {
40        Some(String::from_utf8(standalone?.to_vec())?)
41    } else {
42        None
43    };
44
45    Ok((version, encoding, standalone))
46}
47
48
49