1use crate::{Address, Pool};
2use std::collections::HashMap;
3use std::sync::{Arc, RwLock};
4
5pub struct Pools<P> {
8 pools: Arc<RwLock<HashMap<String, Arc<P>>>>,
9}
10
11impl<P: Pool> Pools<P> {
12 pub fn new() -> Self {
13 Self {
14 pools: Arc::new(RwLock::new(HashMap::new())),
15 }
16 }
17
18 pub fn add_pool(&self, pool: P) -> Option<Arc<P>> {
20 self.add_arc_pool(Arc::new(pool))
21 }
22
23 pub fn add_arc_pool(&self, pool: Arc<P>) -> Option<Arc<P>> {
25 let mut wg = self.pools.write().unwrap();
26 let id = pool.get_id();
27 wg.insert(id.to_string(), pool)
28 }
29
30 pub fn remove_pool(&self, id: &str) -> Option<Arc<P>> {
32 let mut wg = self.pools.write().unwrap();
33 wg.remove(id)
34 }
35
36 pub fn add_backend(&self, name: &str, id: Option<u32>, addr: Address) -> bool {
38 match self.get_pool(name) {
39 None => false,
40 Some(p) => {
41 p.add_backend(id, addr);
42 true
43 }
44 }
45 }
46
47 pub fn remove_backend(&self, name: &str, addr: &Address) -> bool {
49 match self.get_pool(name) {
50 None => false,
51 Some(p) => p.remove_backend(addr),
52 }
53 }
54
55 pub fn get_pool(&self, name: &str) -> Option<Arc<P>> {
57 let g = self.pools.read().unwrap();
58 match g.get(name) {
59 Some(p) => Some(p.clone()),
60 None => g.get("*").map(|p| p.clone()),
61 }
62 }
63
64 pub fn get_all_pools(&self) -> Vec<Arc<P>> {
66 let g = self.pools.read().unwrap();
67 g.values().cloned().collect()
68 }
69}
70
71impl<P> Clone for Pools<P> {
72 fn clone(&self) -> Self {
73 Self {
74 pools: self.pools.clone(),
75 }
76 }
77}