async_rs/util/
addr.rs

1use crate::{
2    Runtime,
3    traits::{AsyncToSocketAddrs, Executor, RuntimeKit},
4};
5use std::{
6    fmt, future, io,
7    net::{SocketAddr, ToSocketAddrs},
8};
9
10/// Wrapper to impl AsyncToSocketAddrs from an IntoIterator<Item = SocketAddr>
11pub 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
35/// Wrapper to perform blocking name resolution on top of an async runtime
36pub 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}