Skip to main content

satex_load_balancer/resolver/
mod.rs

1mod 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}