1 | use std::fmt; |
2 | use std::io; |
3 | use std::net::{SocketAddr, ToSocketAddrs}; |
4 | use std::sync::Arc; |
5 | |
6 | /// A custom resolver to override the default DNS behavior. |
7 | pub trait Resolver: Send + Sync { |
8 | fn resolve(&self, netloc: &str) -> io::Result<Vec<SocketAddr>>; |
9 | } |
10 | |
11 | #[derive (Debug)] |
12 | pub(crate) struct StdResolver; |
13 | |
14 | impl Resolver for StdResolver { |
15 | fn resolve(&self, netloc: &str) -> io::Result<Vec<SocketAddr>> { |
16 | ToSocketAddrs::to_socket_addrs(netloc).map(|iter: IntoIter| iter.collect()) |
17 | } |
18 | } |
19 | |
20 | impl<F> Resolver for F |
21 | where |
22 | F: Fn(&str) -> io::Result<Vec<SocketAddr>>, |
23 | F: Send + Sync, |
24 | { |
25 | fn resolve(&self, netloc: &str) -> io::Result<Vec<SocketAddr>> { |
26 | self(netloc) |
27 | } |
28 | } |
29 | |
30 | #[derive (Clone)] |
31 | pub(crate) struct ArcResolver(Arc<dyn Resolver>); |
32 | |
33 | impl<R> From<R> for ArcResolver |
34 | where |
35 | R: Resolver + 'static, |
36 | { |
37 | fn from(r: R) -> Self { |
38 | Self(Arc::new(data:r)) |
39 | } |
40 | } |
41 | |
42 | impl fmt::Debug for ArcResolver { |
43 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
44 | write!(f, "ArcResolver(...)" ) |
45 | } |
46 | } |
47 | |
48 | impl std::ops::Deref for ArcResolver { |
49 | type Target = dyn Resolver; |
50 | |
51 | fn deref(&self) -> &Self::Target { |
52 | self.0.as_ref() |
53 | } |
54 | } |
55 | |