Skip to main content

steel_registry/registry/
tags.rs

1use 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}