use crate::Loader;
use puniyu_error::registry::Error;
use std::collections::HashMap;
use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::{Arc, RwLock};
static LOADER_INDEX: AtomicU64 = AtomicU64::new(0);
#[derive(Clone, Default)]
pub(crate) struct LoaderStore(Arc<RwLock<HashMap<u64, Arc<dyn Loader>>>>);
impl LoaderStore {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&self, loader: Arc<dyn Loader>) -> Result<u64, Error> {
let mut map = self.0.write().expect("Failed to acquire lock");
if map.values().any(|v| v == &loader) {
return Err(Error::Exists("Loader".to_string()));
}
let index = LOADER_INDEX.fetch_add(1, Ordering::Relaxed);
map.insert(index, loader);
Ok(index)
}
pub fn all(&self) -> Vec<Arc<dyn Loader>> {
let map = &self.0.read().expect("Failed to acquire lock");
map.values().cloned().collect()
}
pub(crate) fn raw(&self) -> Arc<RwLock<HashMap<u64, Arc<dyn Loader>>>> {
self.0.clone()
}
}