route-util 0.1.0

route utils
Documentation
use detcd::Meta;
use http_pool::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()));

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));
}

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