aria_query/
element_role_map.rs1use 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});