aria-query 0.0.6

Rust port of ARIA Query.
Documentation
use std::{hash::RandomState, sync::LazyLock};

use ordered_hash_map::OrderedHashMap;

use crate::{
    etc::roles::{
        r#abstract::ARIA_ABSTRACT_ROLES, dpub::ARIA_DPUB_ROLES, graphics::ARIA_GRAPHICS_ROLES,
        literal::ARIA_LITERAL_ROLES,
    },
    types::{AriaRoleDefinition, AriaRoleDefinitionKey, AriaRoleDefinitionSuperClass},
};

pub static ROLES: LazyLock<OrderedHashMap<AriaRoleDefinitionKey, AriaRoleDefinition, RandomState>> =
    LazyLock::new(|| {
        let role_definitions = (*ARIA_ABSTRACT_ROLES)
            .clone()
            .into_iter()
            .chain(ARIA_LITERAL_ROLES.clone())
            .chain(ARIA_DPUB_ROLES.clone())
            .chain(ARIA_GRAPHICS_ROLES.clone());

        let immutable_roles = OrderedHashMap::from_iter(role_definitions);
        let mut roles = immutable_roles.clone();

        for role_definition in roles.values_mut() {
            for super_classes in &role_definition.super_class {
                for super_class in super_classes {
                    let super_class_role =
                        immutable_roles.iter().find(|(name, _)| match super_class {
                            AriaRoleDefinitionSuperClass::AbstractRole(role) => {
                                **name == AriaRoleDefinitionKey::from(*role)
                            }
                            AriaRoleDefinitionSuperClass::Role(role) => {
                                **name == AriaRoleDefinitionKey::from(*role)
                            }
                        });

                    if let Some((_, super_class_definition)) = super_class_role {
                        for (prop, prop_value) in &super_class_definition.props {
                            if !role_definition.props.contains_key(prop) {
                                role_definition.props.insert(*prop, prop_value.clone());
                            }
                        }
                    }
                }
            }
        }

        roles
    });