#![recursion_limit = "128"]
#[cfg(all(feature = "tokio-runtime", feature = "system-config"))]
fn main() {
use tokio::runtime::Runtime;
use trust_dns_resolver::{name_server::TokioConnectionProvider, TokioAsyncResolver};
tracing_subscriber::fmt::init();
let runtime = Runtime::new().expect("Failed to create runtime");
let resolver = {
#[cfg(any(unix, windows))]
{
TokioAsyncResolver::from_system_conf(TokioConnectionProvider::default())
}
#[cfg(not(any(unix, windows)))]
{
use trust_dns_resolver::config::{ResolverConfig, ResolverOpts};
AsyncResolver::new(
ResolverConfig::google(),
ResolverOpts::default(),
runtime.handle().clone(),
)
}
}
.expect("failed to create resolver");
let names = &["www.google.com", "www.reddit.com", "www.wikipedia.org"];
let mut futures = names
.iter()
.map(|name| (name, resolver.lookup_ip(*name)))
.collect::<Vec<_>>();
for (name, lookup) in futures.drain(..) {
let ips = runtime
.block_on(lookup)
.expect("Failed completing lookup future")
.iter()
.collect::<Vec<_>>();
println!("{name} resolved to {ips:?}");
}
drop(futures);
drop(resolver);
}
#[cfg(not(all(feature = "tokio-runtime", feature = "system-config")))]
fn main() {
println!("tokio-runtime feature must be enabled")
}
#[test]
fn test_multithreaded_runtime() {
main()
}