download_async/
dns.rs

1use std::net::ToSocketAddrs;
2use std::error::Error;
3use std::future::Future;
4use std::pin::Pin;
5use std::task::Poll;
6use hyper::client::connect::dns::Name;
7
8
9#[derive(Debug, Clone)]
10pub struct SocketAddrs {
11  inner: std::vec::IntoIter<std::net::SocketAddr>
12}
13
14impl PartialEq for SocketAddrs {
15  fn eq(&self, other: &SocketAddrs) -> bool {
16    self.inner.as_slice() == other.inner.as_slice()
17  }
18}
19
20impl From<Vec<std::net::SocketAddr>> for SocketAddrs {
21  fn from(other: Vec<std::net::SocketAddr>) -> Self {
22    SocketAddrs {
23      inner: other.into_iter()
24    }
25  }
26}
27
28impl ToSocketAddrs for SocketAddrs {
29  type Iter = std::vec::IntoIter<std::net::SocketAddr>;
30  fn to_socket_addrs(&self) -> std::io::Result<std::vec::IntoIter<std::net::SocketAddr>> {
31    Ok(self.inner.clone())
32  }
33}
34
35impl Iterator for SocketAddrs {
36  type Item = std::net::SocketAddr;
37
38  fn next(&mut self) -> Option<Self::Item> {
39      self.inner.next()
40  }
41}
42
43#[derive(Clone)]
44pub struct ResolverService {
45  pub socket_addrs: SocketAddrs
46}
47
48impl ResolverService {
49  pub fn new(socket_addrs: SocketAddrs) -> Self {
50    ResolverService {
51      socket_addrs
52    }
53  }
54}
55
56impl tower::Service<Name> for ResolverService {
57  type Response = SocketAddrs;
58  type Error = Box<dyn Error + Send + Sync>;
59  // We can't "name" an `async` generated future.
60  type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send >>;
61
62  fn poll_ready(&mut self, _: &mut std::task::Context<'_>) -> Poll<Result<(), Self::Error>> {
63      // This connector is always ready, but others might not be.
64      Poll::Ready(Ok(()))
65  }
66
67  fn call(&mut self, _: Name) -> Self::Future {
68    let socket_addrs = self.socket_addrs.clone();
69    let fut = async move { 
70      Ok(socket_addrs) 
71    };
72    Box::pin(fut)
73  }
74}