Skip to main content

satex_load_balancer/resolver/
make.rs

1use crate::resolver::{ArcLoadBalancerResolver, LoadBalancerResolver};
2use satex_core::Error;
3use satex_core::component::Args;
4use satex_core::make::Make;
5use std::sync::Arc;
6
7pub trait MakeLoadBalancerResolver: Make {
8    type Resolver: LoadBalancerResolver;
9    fn make(&self, args: Args) -> Result<Self::Resolver, Error>;
10}
11
12#[derive(Clone)]
13pub struct ArcMakeLoadBalancerResolver(
14    Arc<dyn MakeLoadBalancerResolver<Resolver = ArcLoadBalancerResolver> + Send + Sync>,
15);
16
17impl ArcMakeLoadBalancerResolver {
18    pub fn new<M>(make: M) -> Self
19    where
20        M: MakeLoadBalancerResolver + Send + Sync + 'static,
21        M::Resolver: Send + Sync + 'static,
22    {
23        Self(Arc::new(Map(make)))
24    }
25}
26
27struct Map<M>(M);
28
29impl<M> Make for Map<M>
30where
31    M: MakeLoadBalancerResolver,
32    M::Resolver: 'static + Send + Sync,
33{
34    fn name(&self) -> &'static str {
35        self.0.name()
36    }
37}
38
39impl<M> MakeLoadBalancerResolver for Map<M>
40where
41    M: MakeLoadBalancerResolver,
42    M::Resolver: Send + Sync + 'static,
43{
44    type Resolver = ArcLoadBalancerResolver;
45
46    fn make(&self, args: Args) -> Result<Self::Resolver, Error> {
47        self.0.make(args).map(ArcLoadBalancerResolver::new)
48    }
49}
50
51impl Make for ArcMakeLoadBalancerResolver {
52    fn name(&self) -> &'static str {
53        self.0.name()
54    }
55}
56
57impl MakeLoadBalancerResolver for ArcMakeLoadBalancerResolver {
58    type Resolver = ArcLoadBalancerResolver;
59
60    fn make(&self, args: Args) -> Result<Self::Resolver, Error> {
61        self.0.make(args)
62    }
63}