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