xavier-internal 0.1.7

Internal module of Xavier. Xavier is a lightweight and versatile XML parsing library designed to streamline the process of handling XML data with ease and efficiency.
Documentation
use quick_xml::events::{BytesStart, Event};
use quick_xml::Reader;
use crate::deserialize::error::PError;
use crate::deserialize::macro_trait::XmlDeserializable;


impl <T: XmlDeserializable> XmlDeserializable for Vec<T>  {

    fn from_xml(reader: &mut Reader<&[u8]>, start_event: Option<&BytesStart>, outer_tag_name: Option<&str>) -> Result<Option<Self>, PError> {
        let mut children: Vec<T> = vec!();
        let tag_name = if let Some(start_event) = start_event {
            String::from_utf8(start_event.name().0.to_vec())?
        } else {
            return Err(PError::new("No tag name found for collection"));
        };

        loop {
            match reader.read_event() {
                Err(error) =>  { return Err(PError::new(&format!("Error at position {}: {:?}", reader.buffer_position(), error))) },
                Ok(Event::Eof) => { },
                Ok(Event::Start(event)) => {
                    let should_parse = if let Some(outer_tag_name) = outer_tag_name {
                        let event_tag = &String::from_utf8(event.name().0.to_vec())?;
                        if  outer_tag_name.eq(event_tag) { true } else { false }
                    } else {
                        true
                    };
                    if should_parse {
                        children.push(
                            T::from_xml(reader, Some(&event), outer_tag_name)?
                                .ok_or_else(|| PError::new("Expected child element but got None"))?
                        );
                    }
                },
                Ok(Event::End(event)) => {
                    if String::from_utf8(event.name().0.to_vec())? == tag_name {
                        return Ok(Some(children))
                    }
                },
                Ok(Event::Empty(_)) => {},
                Ok(Event::Comment(_)) => {},
                Ok(Event::Text(_)) => {},
                Ok(Event::CData(_)) => {},
                Ok(Event::Decl(_)) => {},
                Ok(Event::PI(_)) => {},
                Ok(Event::DocType(_)) => {},
            }
        }
    }
}