use gossan_core::Config;
use hickory_resolver::{
config::{NameServerConfigGroup, ResolverConfig, ResolverOpts},
TokioAsyncResolver,
};
pub fn build_resolver(config: &Config) -> anyhow::Result<TokioAsyncResolver> {
let servers = if config.resolvers.is_empty() {
let mut group = NameServerConfigGroup::cloudflare(); group.merge(NameServerConfigGroup::google()); group.merge(NameServerConfigGroup::quad9()); group
} else {
NameServerConfigGroup::from_ips_clear(&config.resolvers, 53, true)
};
let rc = ResolverConfig::from_parts(None, vec![], servers);
let mut opts = ResolverOpts::default();
opts.timeout = config.timeout();
opts.attempts = 2;
opts.validate = true;
Ok(TokioAsyncResolver::tokio(rc, opts))
}
pub async fn lookup_txt(resolver: &TokioAsyncResolver, name: &str) -> anyhow::Result<Vec<String>> {
let lookup = resolver.txt_lookup(name).await?;
let records: Vec<String> = lookup
.iter()
.flat_map(|txt| txt.iter().map(|d| String::from_utf8_lossy(d).to_string()))
.collect();
Ok(records)
}