1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
use super::selector::ClientSelector; use std::{ collections::HashMap, ops::Deref, sync::{Arc, RwLock}, }; pub trait Discovery<'a> { fn get_services(&self) -> HashMap<String, String>; fn add_selector(&'a self, s: &'a (dyn ClientSelector + Sync + Send + 'static)); fn close(&self); } #[derive(Default)] pub struct StaticDiscovery<'a> { servers: HashMap<String, String>, selectors: Arc<RwLock<Vec<&'a (dyn ClientSelector + Sync + Send + 'static)>>>, } impl<'a> StaticDiscovery<'a> { pub fn new() -> StaticDiscovery<'a> { StaticDiscovery { servers: HashMap::new(), selectors: Arc::new(RwLock::new(Vec::new())), } } pub fn update_servers(&self, servers: &HashMap<String, String>) { let selectors = (*self).selectors.write().unwrap(); let v = selectors.deref(); for s in v { s.update_server(servers); } } } impl<'a> Discovery<'a> for StaticDiscovery<'a> { fn get_services(&self) -> HashMap<String, String> { let mut servers = HashMap::new(); for (k, v) in &self.servers { servers.insert(k.clone(), v.clone()); } servers } fn add_selector(&'a self, s: &'a (dyn ClientSelector + Sync + Send + 'static)) { let mut selectors = (*self).selectors.write().unwrap(); selectors.push(s); } fn close(&self) {} }