reqwest/async_impl/h3_client/
dns.rs1use core::task;
2use hyper_util::client::legacy::connect::dns::Name;
3use std::future::Future;
4use std::net::SocketAddr;
5use std::task::Poll;
6use tower_service::Service;
7
8pub trait Resolve {
10 type Addrs: Iterator<Item = SocketAddr>;
11 type Error: Into<Box<dyn std::error::Error + Send + Sync>>;
12 type Future: Future<Output = Result<Self::Addrs, Self::Error>>;
13
14 fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll<Result<(), Self::Error>>;
15 fn resolve(&mut self, name: Name) -> Self::Future;
16}
17
18impl<S> Resolve for S
19where
20 S: Service<Name>,
21 S::Response: Iterator<Item = SocketAddr>,
22 S::Error: Into<Box<dyn std::error::Error + Send + Sync>>,
23{
24 type Addrs = S::Response;
25 type Error = S::Error;
26 type Future = S::Future;
27
28 fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll<Result<(), Self::Error>> {
29 Service::poll_ready(self, cx)
30 }
31
32 fn resolve(&mut self, name: Name) -> Self::Future {
33 Service::call(self, name)
34 }
35}
36
37pub(super) async fn resolve<R>(resolver: &mut R, name: Name) -> Result<R::Addrs, R::Error>
38where
39 R: Resolve,
40{
41 std::future::poll_fn(|cx| resolver.poll_ready(cx)).await?;
42 resolver.resolve(name).await
43}