mod store;
use crate::Loader;
use crate::types::LoaderId;
use puniyu_error::registry::Error;
use std::sync::{Arc, LazyLock};
use store::LoaderStore;
static STORE: LazyLock<LoaderStore> = LazyLock::new(LoaderStore::new);
pub struct LoaderRegistry;
impl<'l> LoaderRegistry {
pub fn register(loader: Arc<dyn Loader>) -> Result<u64, Error> {
STORE.insert(loader)
}
pub fn unregister<L>(loader: L) -> Result<(), Error>
where
L: Into<LoaderId<'l>>,
{
let loader = loader.into();
match loader {
LoaderId::Index(index) => Self::unregister_with_index(index),
LoaderId::Name(name) => Self::unregister_with_loader_name(name.as_ref()),
}
}
pub fn unregister_with_index(index: u64) -> Result<(), Error> {
let raw = STORE.raw();
let mut map = raw.write().expect("Failed to acquire lock");
if map.remove(&index).is_some() {
Ok(())
} else {
Err(Error::NotFound("Loader".to_string()))
}
}
pub fn unregister_with_loader_name(name: &str) -> Result<(), Error> {
let raw = STORE.raw();
let mut map = raw.write().expect("Failed to acquire lock");
map.retain(|_, h| h.name() != name);
Ok(())
}
pub fn get<L>(loader: L) -> Vec<Arc<dyn Loader>>
where
L: Into<LoaderId<'l>>,
{
let loader = loader.into();
match loader {
LoaderId::Index(index) => Self::get_with_index(index).into_iter().collect(),
LoaderId::Name(name) => Self::get_with_loader_name(name.as_ref()),
}
}
pub fn get_with_index(index: u64) -> Option<Arc<dyn Loader>> {
let raw = STORE.raw();
let map = raw.read().expect("Failed to acquire lock");
map.get(&index).cloned()
}
pub fn get_with_loader_name(name: &str) -> Vec<Arc<dyn Loader>> {
let raw = STORE.raw();
let map = raw.read().expect("Failed to acquire lock");
map.values().filter(|h| h.name() == name).cloned().collect()
}
pub fn all() -> Vec<Arc<dyn Loader>> {
STORE.all()
}
}