aria_query/
element_role_map.rs

1use std::{hash::RandomState, sync::LazyLock};
2
3use ordered_hash_map::OrderedHashMap;
4
5use crate::{AriaRoleRelationConcept, roles_map::ROLES, types::AriaRoleDefinitionKey};
6
7pub static ELEMENT_ROLES: LazyLock<
8    OrderedHashMap<AriaRoleRelationConcept, Vec<AriaRoleDefinitionKey>, RandomState>,
9> = LazyLock::new(|| {
10    let mut element_roles = OrderedHashMap::with_hasher(RandomState::new());
11
12    for (key, role) in ROLES.iter() {
13        let concepts = role
14            .base_concepts
15            .iter()
16            .chain(role.related_concepts.iter());
17
18        for relation in concepts {
19            if relation.module == Some("HTML".into())
20                && let Some(concept) = &relation.concept
21            {
22                let element_role_relation = element_roles.get(concept);
23                let mut roles: Vec<AriaRoleDefinitionKey> = vec![];
24
25                if let Some(element_role_relation) = element_role_relation {
26                    roles.extend(element_role_relation);
27                }
28
29                let mut is_unique = true;
30                for role in &roles {
31                    if *role == *key {
32                        is_unique = false;
33                        break;
34                    }
35                }
36                if is_unique {
37                    roles.push(*key);
38                }
39
40                if element_role_relation.is_none() {
41                    element_roles.insert(concept.clone(), roles);
42                }
43            }
44        }
45    }
46
47    element_roles
48});