use std::collections::HashMap;
use parking_lot::RwLock;
pub struct Registry {
names: RwLock<HashMap<String, u64>>,
}
impl Registry {
pub(crate) fn new() -> Self {
Self { names: RwLock::new(HashMap::new()) }
}
pub(crate) fn register(&self, name: &str, id: u64) {
self.names.write().insert(name.to_string(), id);
}
pub(crate) fn unregister(&self, name: &str) {
self.names.write().remove(name);
}
pub fn lookup(&self, name: &str) -> Option<u64> {
self.names.read().get(name).copied()
}
pub fn contains(&self, name: &str) -> bool {
self.names.read().contains_key(name)
}
pub fn names(&self) -> Vec<String> {
self.names.read().keys().cloned().collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn register_and_lookup() {
let reg = Registry::new();
reg.register("logger", 1);
assert_eq!(reg.lookup("logger"), Some(1));
assert!(reg.contains("logger"));
reg.unregister("logger");
assert!(!reg.contains("logger"));
}
}