extern crate std;
use alloc::vec::Vec;
use std::net::IpAddr;
use dnscrypt::HARDCODED_RESOLVERS;
use crate::servers::RoughtimeServer;
#[must_use]
pub fn resolve_servers(servers: &'static [RoughtimeServer]) -> Vec<(RoughtimeServer, IpAddr)> {
let mut resolved = Vec::with_capacity(servers.len());
for &server in servers {
if let Ok(ips) = dnscrypt::resolve(HARDCODED_RESOLVERS, server.host)
&& let Some(&ip) = ips.first()
{
resolved.push((server, ip));
}
}
resolved
}
#[cfg(feature = "tokio-client")]
pub async fn resolve_servers_async(
servers: &'static [RoughtimeServer],
) -> Vec<(RoughtimeServer, IpAddr)> {
let mut handles = Vec::with_capacity(servers.len());
for &server in servers {
handles.push(tokio::spawn(async move {
dnscrypt::resolve_async(HARDCODED_RESOLVERS, server.host)
.await
.ok()
.and_then(|ips| ips.first().copied())
.map(|ip| (server, ip))
}));
}
let mut resolved = Vec::with_capacity(handles.len());
for handle in handles {
if let Ok(Some(entry)) = handle.await {
resolved.push(entry);
}
}
resolved
}
#[cfg(test)]
mod tests {
use super::resolve_servers;
#[test]
fn empty_input_resolves_to_nothing() {
assert!(resolve_servers(&[]).is_empty());
}
#[cfg(feature = "tokio-client")]
#[tokio::test]
async fn empty_input_resolves_to_nothing_async() {
assert!(super::resolve_servers_async(&[]).await.is_empty());
}
}