use std::collections::HashMap;
use std::sync::{Arc, OnceLock, RwLock};
use crate::error::{ChrononError, Result};
use crate::store::SchedulerStore;
pub const DEFAULT_STORE_NAME: &str = "default";
static GLOBAL_ROUTER: OnceLock<RwLock<StoreRouter>> = OnceLock::new();
fn global_router() -> &'static RwLock<StoreRouter> {
GLOBAL_ROUTER.get_or_init(|| RwLock::new(StoreRouter::new()))
}
#[derive(Default)]
pub struct StoreRouter {
stores: HashMap<String, Arc<dyn SchedulerStore>>,
}
impl StoreRouter {
pub fn new() -> Self {
Self {
stores: HashMap::new(),
}
}
pub fn register(&mut self, name: impl Into<String>, store: Arc<dyn SchedulerStore>) {
self.stores.insert(name.into(), store);
}
pub fn get(&self, name: &str) -> Option<Arc<dyn SchedulerStore>> {
self.stores.get(name).cloned()
}
pub fn install_global(router: Self) {
let _ = GLOBAL_ROUTER.set(RwLock::new(router));
}
pub fn register_global(name: impl Into<String>, store: Arc<dyn SchedulerStore>) {
global_router()
.write()
.expect("StoreRouter lock poisoned")
.register(name, store);
}
}
pub fn default_store_from_global() -> Result<Arc<dyn SchedulerStore>> {
global_router()
.read()
.expect("StoreRouter lock poisoned")
.get(DEFAULT_STORE_NAME)
.ok_or_else(|| ChrononError::StorageError("no default SchedulerStore registered".into()))
}