1use std::collections::HashMap;
2use parking_lot::RwLock;
3
4pub struct Registry {
6 names: RwLock<HashMap<String, u64>>,
7}
8
9impl Registry {
10 pub(crate) fn new() -> Self {
11 Self { names: RwLock::new(HashMap::new()) }
12 }
13 pub(crate) fn register(&self, name: &str, id: u64) {
14 self.names.write().insert(name.to_string(), id);
15 }
16 pub(crate) fn unregister(&self, name: &str) {
17 self.names.write().remove(name);
18 }
19 pub fn lookup(&self, name: &str) -> Option<u64> {
20 self.names.read().get(name).copied()
21 }
22 pub fn contains(&self, name: &str) -> bool {
23 self.names.read().contains_key(name)
24 }
25 pub fn names(&self) -> Vec<String> {
26 self.names.read().keys().cloned().collect()
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33 #[test]
34 fn register_and_lookup() {
35 let reg = Registry::new();
36 reg.register("logger", 1);
37 assert_eq!(reg.lookup("logger"), Some(1));
38 assert!(reg.contains("logger"));
39 reg.unregister("logger");
40 assert!(!reg.contains("logger"));
41 }
42}