1use hyper_util::client::legacy::connect::dns::GaiResolver as HyperGaiResolver;
2use tower_service::Service;
3
4use crate::dns::{Addrs, Name, Resolve, Resolving};
5use crate::error::BoxError;
6
7#[derive(Debug)]
8pub struct GaiResolver(HyperGaiResolver);
9
10impl GaiResolver {
11 pub fn new() -> Self {
12 Self(HyperGaiResolver::new())
13 }
14}
15
16impl Default for GaiResolver {
17 fn default() -> Self {
18 GaiResolver::new()
19 }
20}
21
22impl Resolve for GaiResolver {
23 fn resolve(&self, name: Name) -> Resolving {
24 let mut this = self.0.clone();
25 Box::pin(async move {
26 this.call(name.0)
27 .await
28 .map(|addrs| Box::new(addrs) as Addrs)
29 .map_err(|err| Box::new(err) as BoxError)
30 })
31 }
32}