use detcd::Meta;
use http_pool::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()));
fn read_extra_data(key: &str) -> Option<Arc<Meta>> {
let g = POOLS_EXTRA_DATA.read().unwrap();
g.get(key).map(|v| v.clone())
}
fn try_write_extra_data(key: &str, meta: &Meta) -> bool {
if let None = read_extra_data(key) {
let mut g = POOLS_EXTRA_DATA.write().unwrap();
let _ = g.insert(key.to_string(), Arc::new(meta.clone()));
true
} else {
false
}
}
fn write_extra_data(key: String, meta: Meta) {
let mut g = POOLS_EXTRA_DATA.write().unwrap();
let _ = g.insert(key, Arc::new(meta));
}
pub trait PoolsWithGlobalExtra {
fn add_global_meta(&self, name: &str, meta: &Meta) -> bool;
fn read_global_meta(&self, name: &str) -> Option<Arc<Meta>>;
fn update_global_meta(&self, name: String, meta: Meta);
}
impl<P: Pool> PoolsWithGlobalExtra for Pools<P> {
fn add_global_meta(&self, name: &str, meta: &Meta) -> bool {
try_write_extra_data(name, meta)
}
fn read_global_meta(&self, name: &str) -> Option<Arc<Meta>> {
read_extra_data(name)
}
fn update_global_meta(&self, name: String, meta: Meta) {
write_extra_data(name, meta)
}
}