use crate::models::DomainResult;
use anyhow::Result;
use std::time::Duration;
use trust_dns_resolver::config::{ResolverConfig, ResolverOpts};
use trust_dns_resolver::TokioAsyncResolver;
pub async fn verify_domain_exists(domain: &str) -> Result<bool> {
let resolver = TokioAsyncResolver::tokio(ResolverConfig::default(), ResolverOpts::default());
let lookup_future = resolver.lookup_ip(domain);
let timeout_future = tokio::time::sleep(Duration::from_secs(5));
tokio::select! {
result = lookup_future => {
match result {
Ok(_) => Ok(true),
Err(_) => Ok(false), }
}
_ = timeout_future => {
Ok(false) }
}
}
pub async fn verify_domains_concurrent(domains: Vec<DomainResult>) -> Vec<DomainResult> {
use futures::future::join_all;
let verification_futures: Vec<_> = domains
.into_iter()
.map(|domain| {
let domain_name = domain.domain_name.clone();
async move {
match verify_domain_exists(&domain_name).await {
Ok(true) => Some(domain),
_ => None,
}
}
})
.collect();
let results = join_all(verification_futures).await;
results.into_iter().flatten().collect()
}