use crate::{Address, Pool};
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
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(),
}
}
}