satex_load_balancer/resolver/
mod.rs1mod r#static;
2mod make;
3
4pub use make::*;
5pub use r#static::*;
6
7use crate::LoadBalancer;
8use std::sync::Arc;
9
10pub trait LoadBalancerResolver {
11 fn find(&self, name: &str) -> Option<Arc<LoadBalancer>>;
12}
13
14#[derive(Clone)]
15pub struct ArcLoadBalancerResolver(Arc<dyn LoadBalancerResolver + Send + Sync>);
16
17impl ArcLoadBalancerResolver {
18 pub fn new<R>(resolver: R) -> Self
19 where
20 R: LoadBalancerResolver + Send + Sync + 'static,
21 {
22 Self(Arc::new(resolver))
23 }
24}
25
26impl LoadBalancerResolver for ArcLoadBalancerResolver {
27 fn find(&self, name: &str) -> Option<Arc<LoadBalancer>> {
28 self.0.find(name)
29 }
30}
31
32#[derive(Default)]
33pub struct CompositeLoadBalancerResolver(Vec<ArcLoadBalancerResolver>);
34
35impl CompositeLoadBalancerResolver {
36 pub fn push<R>(mut self, resolver: R) -> Self
37 where
38 R: LoadBalancerResolver + Send + Sync + 'static,
39 {
40 self.0.push(ArcLoadBalancerResolver::new(resolver));
41 self
42 }
43}
44
45impl LoadBalancerResolver for CompositeLoadBalancerResolver {
46 fn find(&self, name: &str) -> Option<Arc<LoadBalancer>> {
47 for resolver in self.0.iter() {
48 if let Some(load_balancer) = resolver.find(name) {
49 return Some(load_balancer);
50 }
51 }
52 None
53 }
54}