rusoto_core 0.33.1

AWS SDK for Rust - Core
Documentation
use xmlutil::{XmlParseError, Peek, Next};
use xmlutil::{characters, start_element, end_element, skip_tree, string_field, peek_at_name};

#[derive(Default, Debug)]
pub struct XmlError {
    pub error_type: String,
    pub code: String,
    pub message: String,
    pub detail: Option<String>,
}

pub struct XmlErrorDeserializer;
impl XmlErrorDeserializer {
    pub fn deserialize<T: Peek + Next>(tag_name: &str,
                                       stack: &mut T)
                                       -> Result<XmlError, XmlParseError> {
        start_element(tag_name, stack)?;

        let mut obj = XmlError::default();

        loop {
            match &peek_at_name(stack)?[..] {
                "Type" => {
                    obj.error_type = string_field("Type", stack)?;
                }
                "Code" => {
                    obj.code = string_field("Code", stack)?;
                }
                "Message" => {
                    obj.message = string_field("Message", stack)?;
                }
                "Detail" => {
                    start_element("Detail", stack)?;
                    if let Ok(characters) = characters(stack) {
                        obj.detail = Some(characters.to_string());
                        end_element("Detail", stack)?;
                    }
                },
                "" => {
                    break
                },
                unknown => {
                    debug!("Ignoring unknown XML element {:?} in error response.", unknown);
                    skip_tree(stack);
                }
            }
        }

        end_element(tag_name, stack)?;

        Ok(obj)
    }
}