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 });