net-pool 0.5.1

A set of types for network connection pool.
Documentation
use crate::{Address, Pool};
use std::collections::HashMap;
use std::sync::{Arc, RwLock};

/// 管理多个连接池
/// 每个连接池靠id来识别, id为*时代表适用于所有
pub struct Pools<P> {
    pools: Arc<RwLock<HashMap<String, Arc<P>>>>,
}

impl<P: Pool> Pools<P> {
    pub fn new() -> Self {
        Self {
            pools: Arc::new(RwLock::new(HashMap::new())),
        }
    }

    /// 添加连接池
    pub fn add_pool(&self, pool: P) -> Option<Arc<P>> {
        self.add_arc_pool(Arc::new(pool))
    }

    /// 添加连接池
    pub fn add_arc_pool(&self, pool: Arc<P>) -> Option<Arc<P>> {
        let mut wg = self.pools.write().unwrap();
        let id = pool.get_id();
        wg.insert(id.to_string(), pool)
    }

    /// 移除连接池
    pub fn remove_pool(&self, id: &str) -> Option<Arc<P>> {
        let mut wg = self.pools.write().unwrap();
        wg.remove(id)
    }

    /// 添加后端地址
    pub fn add_backend(&self, name: &str, id: Option<u32>, addr: Address) -> bool {
        match self.get_pool(name) {
            None => false,
            Some(p) => {
                p.add_backend(id, addr);
                true
            }
        }
    }

    /// 移除后端地址
    pub fn remove_backend(&self, name: &str, addr: &Address) -> bool {
        match self.get_pool(name) {
            None => false,
            Some(p) => p.remove_backend(addr),
        }
    }

    /// 获取连接池
    pub fn get_pool(&self, name: &str) -> Option<Arc<P>> {
        let g = self.pools.read().unwrap();
        match g.get(name) {
            Some(p) => Some(p.clone()),
            None => g.get("*").map(|p| p.clone()),
        }
    }

    /// 获取所有的连接池
    pub fn get_all_pools(&self) -> Vec<Arc<P>> {
        let g = self.pools.read().unwrap();
        g.values().cloned().collect()
    }
}

impl<P> Clone for Pools<P> {
    fn clone(&self) -> Self {
        Self {
            pools: self.pools.clone(),
        }
    }
}