1use crate::{
2 Runtime,
3 traits::{AsyncToSocketAddrs, Executor, RuntimeKit},
4};
5use std::{
6 fmt, future, io,
7 net::{SocketAddr, ToSocketAddrs},
8};
9
10pub struct SocketAddrs<I: IntoIterator<Item = SocketAddr> + Send + 'static>(pub I);
12
13impl<I: IntoIterator<Item = SocketAddr> + Send + fmt::Debug + 'static> AsyncToSocketAddrs
14 for SocketAddrs<I>
15where
16 I::IntoIter: Send + 'static,
17{
18 fn to_socket_addrs(
19 self,
20 ) -> impl Future<Output = io::Result<impl Iterator<Item = SocketAddr> + Send + 'static>>
21 + Send
22 + 'static {
23 future::ready(Ok(self.0.into_iter()))
24 }
25}
26
27impl<I: IntoIterator<Item = SocketAddr> + Send + fmt::Debug + 'static> fmt::Debug
28 for SocketAddrs<I>
29{
30 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
31 f.debug_tuple("SocketAddrs").field(&self.0).finish()
32 }
33}
34
35pub struct SocketAddrsResolver<'a, RK: RuntimeKit, A: ToSocketAddrs + Send + 'static> {
37 pub(crate) runtime: &'a Runtime<RK>,
38 pub(crate) addrs: A,
39}
40
41impl<'a, RK: RuntimeKit, A: ToSocketAddrs + Send + 'static> AsyncToSocketAddrs
42 for SocketAddrsResolver<'a, RK, A>
43where
44 <A as ToSocketAddrs>::Iter: Iterator<Item = SocketAddr> + Send + 'static,
45{
46 fn to_socket_addrs(
47 self,
48 ) -> impl Future<Output = io::Result<impl Iterator<Item = SocketAddr> + Send + 'static>>
49 + Send
50 + 'static {
51 let SocketAddrsResolver { runtime, addrs } = self;
52 runtime.spawn_blocking(move || addrs.to_socket_addrs())
53 }
54}
55
56impl<'a, RK: RuntimeKit, A: ToSocketAddrs + Send + fmt::Debug + 'static> fmt::Debug
57 for SocketAddrsResolver<'a, RK, A>
58{
59 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
60 f.debug_struct("SocketAddrsResolver")
61 .field("addrs", &self.addrs)
62 .finish()
63 }
64}