use detector::Meta;
use net_pool::{Pool, Pools};
use std::collections::HashMap;
use std::sync::{Arc, LazyLock, RwLock};
static POOLS_EXTRA_DATA: LazyLock<RwLock<HashMap<String, Arc<Meta>>>> =
LazyLock::new(|| RwLock::new(HashMap::new()));
pub trait PoolsWithExtra {
fn write_extra_meta(&self, name: &str, meta: &Meta) -> bool;
fn read_extra_meta(&self, name: &str) -> Option<Arc<Meta>>;
fn update_extra_meta(&self, name: String, meta: Meta);
}
impl<P: Pool> PoolsWithExtra for Pools<P> {
fn write_extra_meta(&self, name: &str, meta: &Meta) -> bool {
if let None = self.read_extra_meta(name) {
let mut g = POOLS_EXTRA_DATA.write().unwrap();
let _ = g.insert(name.to_string(), Arc::new(meta.clone()));
true
} else {
false
}
}
fn read_extra_meta(&self, name: &str) -> Option<Arc<Meta>> {
let g = POOLS_EXTRA_DATA.read().unwrap();
g.get(name).map(|v| v.clone())
}
fn update_extra_meta(&self, name: String, meta: Meta) {
let mut g = POOLS_EXTRA_DATA.write().unwrap();
let _ = g.insert(name, Arc::new(meta));
}
}