xavier_internal/deserialize/
declaration.rs1use 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