xianyun_cluster/
registry.rs1use crate::driver::{Driver, DriverError};
5use std::collections::HashMap;
6use std::sync::{LazyLock, RwLock};
7use xianyun_core::config::types::ClusterConfig;
8
9pub type DriverFactory = fn(ClusterConfig, String) -> Box<dyn Driver>;
11
12static REGISTRY: LazyLock<RwLock<HashMap<String, DriverFactory>>> =
13 LazyLock::new(|| RwLock::new(HashMap::new()));
14
15pub fn register_driver(name: &str, factory: DriverFactory) {
21 let mut registry = REGISTRY
22 .write()
23 .unwrap_or_else(std::sync::PoisonError::into_inner);
24 assert!(
25 !registry.contains_key(name),
26 "driver already registered: {name}"
27 );
28 registry.insert(name.to_string(), factory);
29}
30
31pub fn new_manager(
38 cfg: ClusterConfig,
39 profile_name: String,
40) -> Result<Box<dyn Driver>, DriverError> {
41 let registry = REGISTRY
42 .read()
43 .unwrap_or_else(std::sync::PoisonError::into_inner);
44 let factory = registry
45 .get(cfg.driver.as_str())
46 .ok_or_else(|| DriverError::DriverNotFound(cfg.driver.clone()))?;
47 Ok(factory(cfg, profile_name))
48}
49
50pub fn list_drivers() -> Vec<String> {
52 let mut names: Vec<String> = REGISTRY
53 .read()
54 .unwrap_or_else(std::sync::PoisonError::into_inner)
55 .keys()
56 .cloned()
57 .collect();
58 names.sort();
59 names
60}
61
62#[doc(hidden)]
71pub fn __reset_for_tests() {
72 REGISTRY
73 .write()
74 .unwrap_or_else(std::sync::PoisonError::into_inner)
75 .clear();
76}