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 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 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}