satex_load_balancer/resolver/
make.rs1use 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}