service-pool-util 0.1.1

服务连接池辅助
Documentation
use detector::Meta;
use net_pool::{Pool, Pools};
use std::collections::HashMap;
use std::sync::{Arc, LazyLock, RwLock};

/// pools的全局额外数据
static POOLS_EXTRA_DATA: LazyLock<RwLock<HashMap<String, Arc<Meta>>>> =
    LazyLock::new(|| RwLock::new(HashMap::new()));

/// 额外数据扩展trait
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));
    }
}