use crate::value::Value;
use std::collections::HashMap;
use std::sync::{Mutex, OnceLock};
fn registry() -> &'static Mutex<HashMap<String, Value>> {
static REG: OnceLock<Mutex<HashMap<String, Value>>> = OnceLock::new();
REG.get_or_init(|| Mutex::new(HashMap::new()))
}
pub fn register(name: &str, actor: Value) -> Result<(), RegError> {
let mut g = registry().lock().expect("conc registry poisoned");
if g.contains_key(name) {
return Err(RegError::AlreadyRegistered(name.to_string()));
}
g.insert(name.to_string(), actor);
Ok(())
}
pub fn lookup(name: &str) -> Option<Value> {
let g = registry().lock().expect("conc registry poisoned");
g.get(name).cloned()
}
pub fn unregister(name: &str) -> Result<(), RegError> {
let mut g = registry().lock().expect("conc registry poisoned");
if g.remove(name).is_none() {
return Err(RegError::NotRegistered(name.to_string()));
}
Ok(())
}
pub fn registered() -> Vec<String> {
let g = registry().lock().expect("conc registry poisoned");
let mut names: Vec<String> = g.keys().cloned().collect();
names.sort();
names
}
#[derive(Debug, Clone)]
pub enum RegError {
AlreadyRegistered(String),
NotRegistered(String),
}
#[doc(hidden)]
pub fn _reset_for_tests() {
let mut g = registry().lock().expect("conc registry poisoned");
g.clear();
}