use gossan_core::Config;
use hickory_resolver::TokioResolver;
pub fn build_resolver(config: &Config) -> anyhow::Result<TokioResolver> {
gossan_core::net::build_resolver(config)
}
pub async fn lookup_txt(resolver: &TokioResolver, name: &str) -> anyhow::Result<Vec<String>> {
let lookup = resolver.txt_lookup(name).await?;
let records: Vec<String> = lookup
.iter()
.map(|txt| {
txt.iter()
.map(|d| String::from_utf8_lossy(d).to_string())
.collect::<Vec<String>>()
.join("")
})
.collect();
Ok(records)
}
#[derive(Debug, Clone)]
pub enum TxtLookup {
Records(Vec<String>),
Absent,
}
pub async fn lookup_txt_classified(
resolver: &TokioResolver,
name: &str,
) -> anyhow::Result<TxtLookup> {
match resolver.txt_lookup(name).await {
Ok(lookup) => {
let records: Vec<String> = lookup
.iter()
.map(|txt| {
txt.iter()
.map(|d| String::from_utf8_lossy(d).to_string())
.collect::<Vec<String>>()
.join("")
})
.collect();
if records.is_empty() {
Ok(TxtLookup::Absent)
} else {
Ok(TxtLookup::Records(records))
}
}
Err(e) if e.is_nx_domain() || e.is_no_records_found() => Ok(TxtLookup::Absent),
Err(e) => Err(e.into()),
}
}