25 lines
682 B
Rust
25 lines
682 B
Rust
use std::{future::Future, io, net::IpAddr};
|
|
|
|
pub trait Resolver: Send + Sync {
|
|
fn resolve(
|
|
&self,
|
|
host: &str,
|
|
port: u16,
|
|
) -> impl Future<Output = io::Result<Vec<IpAddr>>> + Send;
|
|
}
|
|
|
|
#[derive(Clone, Copy, Debug, Default)]
|
|
pub struct SystemResolver;
|
|
|
|
impl Resolver for SystemResolver {
|
|
async fn resolve(&self, host: &str, port: u16) -> io::Result<Vec<IpAddr>> {
|
|
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)
|
|
}
|
|
}
|