satex-load-balancer 0.5.2

Satex Load Balancer Library
Documentation
mod r#static;
mod make;

pub use make::*;
pub use r#static::*;

use crate::LoadBalancer;
use std::sync::Arc;

pub trait LoadBalancerResolver {
    fn find(&self, name: &str) -> Option<Arc<LoadBalancer>>;
}

#[derive(Clone)]
pub struct ArcLoadBalancerResolver(Arc<dyn LoadBalancerResolver + Send + Sync>);

impl ArcLoadBalancerResolver {
    pub fn new<R>(resolver: R) -> Self
    where
        R: LoadBalancerResolver + Send + Sync + 'static,
    {
        Self(Arc::new(resolver))
    }
}

impl LoadBalancerResolver for ArcLoadBalancerResolver {
    fn find(&self, name: &str) -> Option<Arc<LoadBalancer>> {
        self.0.find(name)
    }
}

#[derive(Default)]
pub struct CompositeLoadBalancerResolver(Vec<ArcLoadBalancerResolver>);

impl CompositeLoadBalancerResolver {
    pub fn push<R>(mut self, resolver: R) -> Self
    where
        R: LoadBalancerResolver + Send + Sync + 'static,
    {
        self.0.push(ArcLoadBalancerResolver::new(resolver));
        self
    }
}

impl LoadBalancerResolver for CompositeLoadBalancerResolver {
    fn find(&self, name: &str) -> Option<Arc<LoadBalancer>> {
        for resolver in self.0.iter() {
            if let Some(load_balancer) = resolver.find(name) {
                return Some(load_balancer);
            }
        }
        None
    }
}