steel_registry/registry/
tags.rs1use rustc_hash::{FxHashMap, FxHashSet};
2use steel_utils::Identifier;
3
4#[derive(Debug, Default)]
5pub struct RegistryTags {
6 tags: FxHashMap<Identifier, RegistryTag>,
7}
8
9#[derive(Debug)]
10struct RegistryTag {
11 ordered_keys: Vec<&'static Identifier>,
12 member_keys: FxHashSet<&'static Identifier>,
13}
14
15impl RegistryTag {
16 fn new(ordered_keys: Vec<&'static Identifier>) -> Self {
17 let member_keys = ordered_keys.iter().copied().collect();
18 Self {
19 ordered_keys,
20 member_keys,
21 }
22 }
23}
24
25impl RegistryTags {
26 #[doc(hidden)]
27 pub fn insert(&mut self, tag: Identifier, ordered_keys: Vec<&'static Identifier>) {
28 self.tags.insert(tag, RegistryTag::new(ordered_keys));
29 }
30
31 #[doc(hidden)]
32 pub fn remove(&mut self, tag: &Identifier) -> Option<Vec<&'static Identifier>> {
33 self.tags.remove(tag).map(|tag| tag.ordered_keys)
34 }
35
36 #[doc(hidden)]
37 #[must_use]
38 pub fn contains(&self, tag: &Identifier, entry_key: &Identifier) -> bool {
39 self.tags
40 .get(tag)
41 .is_some_and(|entries| entries.member_keys.contains(entry_key))
42 }
43
44 #[doc(hidden)]
45 #[must_use]
46 pub fn get(&self, tag: &Identifier) -> Option<&[&'static Identifier]> {
47 self.tags
48 .get(tag)
49 .map(|entries| entries.ordered_keys.as_slice())
50 }
51
52 #[doc(hidden)]
53 pub fn keys(&self) -> impl Iterator<Item = &Identifier> + '_ {
54 self.tags.keys()
55 }
56}