xml-schema-derive 0.3.0

Structure generator from XSD source file
Documentation
use std::io::Read;
use xml::reader::XmlEvent;
use yaserde::YaDeserialize;

#[derive(Clone, Debug, Default, PartialEq)]
pub enum MaxOccurences {
  #[default]
  Unbounded,
  Number {
    value: u32,
  },
}

impl YaDeserialize for MaxOccurences {
  fn deserialize<R: Read>(reader: &mut yaserde::de::Deserializer<R>) -> Result<Self, String> {
    if let XmlEvent::StartElement { name, .. } = reader.peek()? {
      if name.local_name != "MaxOccurences" {
        return Err("Unable to parse Max Occurences field".to_string());
      }
      let _start_event = reader.next_event();

      let content = reader.next_event()?;

      match content {
        XmlEvent::Characters(value) => {
          if value == "unbounded" {
            Ok(MaxOccurences::Unbounded)
          } else {
            let number = value.parse::<u32>().map_err(|e| e.to_string())?;
            Ok(MaxOccurences::Number { value: number })
          }
        }
        _ => Err("bad content for Max Occurences field".to_string()),
      }
    } else {
      Err("Missing start event for Max Occurences field".to_string())
    }
  }
}