xsd-parser 1.5.2

Rust code generator for XML schema files
Documentation
use std::collections::HashMap;

use crate::models::{
    meta::{Base, MetaTypeVariant, MetaTypes},
    TypeIdent,
};

#[derive(Debug)]
pub(crate) struct BaseMap(HashMap<TypeIdent, Base>);

impl BaseMap {
    pub(crate) fn new(types: &MetaTypes) -> Self {
        let mut ret = HashMap::new();

        for (ident, type_) in &types.items {
            match &type_.variant {
                MetaTypeVariant::Enumeration(ei) => {
                    if matches!(
                        ei.base.as_ident().and_then(|base| types.get_variant(base)),
                        Some(MetaTypeVariant::Enumeration(_))
                    ) {
                        ret.insert(ident.clone(), ei.base.clone());
                    }
                }
                MetaTypeVariant::Union(ei) => {
                    if matches!(
                        ei.base.as_ident().and_then(|base| types.get_variant(base)),
                        Some(MetaTypeVariant::Union(_))
                    ) {
                        ret.insert(ident.clone(), ei.base.clone());
                    }
                }
                MetaTypeVariant::SimpleType(si) => {
                    ret.insert(ident.clone(), Base::Restriction(si.base.clone()));
                }
                MetaTypeVariant::ComplexType(ci) => {
                    if matches!(
                        ci.base.as_ident().and_then(|base| types.get_variant(base)),
                        Some(MetaTypeVariant::ComplexType(_))
                    ) {
                        ret.insert(ident.clone(), ci.base.clone());
                    }
                }
                _ => (),
            }
        }

        Self(ret)
    }

    pub(crate) fn get_unrestricted<'a>(&'a self, ident: &'a TypeIdent) -> &'a TypeIdent {
        match self.0.get(ident) {
            Some(Base::Restriction(base)) => self.get_unrestricted(base),
            _ => ident,
        }
    }
}