deboa_compio/client/
dns.rs1use 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)]
10pub 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}