Skip to main content

deboa_compio/client/
dns.rs

1use compio::net::ToSocketAddrsAsync;
2use deboa::{
3    dns::{DnsResolver, DnsResolverFuture},
4    errors::{DeboaError::Dns, DnsError},
5};
6use rand::seq::SliceRandom;
7use std::net::IpAddr;
8
9#[derive(Default, Clone)]
10/// Default DNS resolver implementation using smol::net::resolve
11pub struct DefaultDnsResolver;
12
13impl DnsResolver for DefaultDnsResolver {
14    fn resolve(&self, host: String, port: u16) -> DnsResolverFuture {
15        let future = async move {
16            let hostname = format!("{}:{}", host, port);
17            let addrs = hostname
18                .to_socket_addrs_async()
19                .await;
20            if let Err(e) = addrs {
21                return Err(Dns(DnsError::Resolve { host, message: e.to_string() }));
22            };
23
24            let mut ips: Vec<IpAddr> = addrs
25                .unwrap()
26                .map(|addr| addr.ip())
27                .collect();
28            ips.shuffle(&mut rand::rng());
29            Ok(ips)
30        };
31        Box::pin(future)
32    }
33}