aria_query/
roles_map.rs

1use std::{hash::RandomState, sync::LazyLock};
2
3use ordered_hash_map::OrderedHashMap;
4
5use crate::{
6    etc::roles::{
7        r#abstract::ARIA_ABSTRACT_ROLES, dpub::ARIA_DPUB_ROLES, graphics::ARIA_GRAPHICS_ROLES,
8        literal::ARIA_LITERAL_ROLES,
9    },
10    types::{AriaRoleDefinition, AriaRoleDefinitionKey, AriaRoleDefinitionSuperClass},
11};
12
13pub static ROLES: LazyLock<OrderedHashMap<AriaRoleDefinitionKey, AriaRoleDefinition, RandomState>> =
14    LazyLock::new(|| {
15        let role_definitions = (*ARIA_ABSTRACT_ROLES)
16            .clone()
17            .into_iter()
18            .chain(ARIA_LITERAL_ROLES.clone())
19            .chain(ARIA_DPUB_ROLES.clone())
20            .chain(ARIA_GRAPHICS_ROLES.clone());
21
22        let immutable_roles = OrderedHashMap::from_iter(role_definitions);
23        let mut roles = immutable_roles.clone();
24
25        for role_definition in roles.values_mut() {
26            for super_classes in &role_definition.super_class {
27                for super_class in super_classes {
28                    let super_class_role =
29                        immutable_roles.iter().find(|(name, _)| match super_class {
30                            AriaRoleDefinitionSuperClass::AbstractRole(role) => {
31                                **name == AriaRoleDefinitionKey::from(*role)
32                            }
33                            AriaRoleDefinitionSuperClass::Role(role) => {
34                                **name == AriaRoleDefinitionKey::from(*role)
35                            }
36                        });
37
38                    if let Some((_, super_class_definition)) = super_class_role {
39                        for (prop, prop_value) in &super_class_definition.props {
40                            if !role_definition.props.contains_key(prop) {
41                                role_definition.props.insert(*prop, prop_value.clone());
42                            }
43                        }
44                    }
45                }
46            }
47        }
48
49        roles
50    });