use std::{future::Future, io, net::IpAddr}; pub trait Resolver: Send + Sync { fn resolve( &self, host: &str, port: u16, ) -> impl Future>> + Send; } #[derive(Clone, Copy, Debug, Default)] pub struct SystemResolver; impl Resolver for SystemResolver { async fn resolve(&self, host: &str, port: u16) -> io::Result> { let addresses = tokio::net::lookup_host((host, port)).await?; let mut unique = Vec::new(); for address in addresses { if !unique.contains(&address.ip()) { unique.push(address.ip()); } } Ok(unique) } }