pub struct DnsResolver { /* private fields */ }Expand description
DNS resolver for querying various record types.
Uses Google DNS (8.8.8.8) by default, but supports custom nameservers
over plain UDP, DNS over TLS (tls://), and DNS over HTTPS (https://)
— see NameserverSpec for the accepted forms.
The default resolver is cached and reused across queries to avoid
repeated initialization overhead.
Implementations§
Source§impl DnsResolver
impl DnsResolver
Sourcepub fn from_config(config: &SeerConfig) -> Self
pub fn from_config(config: &SeerConfig) -> Self
Builds a resolver honoring ~/.seer/config.toml settings.
Reads timeouts.dns_secs (already clamped to 1–60s by
crate::config::SeerConfig::load). Sugar over
DnsResolver::with_timeout — equivalent to
DnsResolver::new().with_timeout(config.dns_timeout()).
The nameserver config key is deliberately NOT applied here: the
resolver takes the nameserver per-query (see DnsResolver::resolve),
so callers thread config.nameserver at the call site where it can be
overridden per-invocation.
Sourcepub fn with_timeout(self, timeout: Duration) -> Self
pub fn with_timeout(self, timeout: Duration) -> Self
Sets the timeout for DNS queries.
The default is 5 seconds, which is sufficient for most DNS queries.
Sourcepub async fn resolve(
&self,
domain: &str,
record_type: RecordType,
nameserver: Option<&str>,
) -> Result<Vec<DnsRecord>>
pub async fn resolve( &self, domain: &str, record_type: RecordType, nameserver: Option<&str>, ) -> Result<Vec<DnsRecord>>
Resolves DNS records for a domain.
§Arguments
domain- The domain name to queryrecord_type- The type of DNS record to look up (A, AAAA, MX, etc.)nameserver- Optional custom nameserver spec; uses Google DNS if None. Accepts a bare IP/hostname with optional port (UDP),tls://host[:port](DNS over TLS), orhttps://host[:port][/path](DNS over HTTPS) — seeNameserverSpec
Sourcepub async fn resolve_srv(
&self,
service: &str,
protocol: &str,
domain: &str,
nameserver: Option<&str>,
) -> Result<Vec<DnsRecord>>
pub async fn resolve_srv( &self, service: &str, protocol: &str, domain: &str, nameserver: Option<&str>, ) -> Result<Vec<DnsRecord>>
Resolves SRV records for a service.
§Arguments
service- The service name (e.g., “http”, “ldap”)protocol- The protocol (e.g., “tcp”, “udp”)domain- The domain namenameserver- Optional custom nameserver IP
Source§impl DnsResolver
impl DnsResolver
Sourcepub async fn presence(&self, domain: &str) -> DnsPresence
pub async fn presence(&self, domain: &str) -> DnsPresence
Probes whether a domain has any DNS presence by querying its apex NS records. A registered, delegated domain returns NS records; an unregistered domain returns NXDOMAIN (an empty record set).
This is a heuristic, not proof: a registered-but-undelegated domain
also has no NS records, so callers should treat
DnsPresence::Absent as “likely available” (medium confidence).
Trait Implementations§
Source§impl Clone for DnsResolver
impl Clone for DnsResolver
Source§fn clone(&self) -> DnsResolver
fn clone(&self) -> DnsResolver
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for DnsResolver
impl Debug for DnsResolver
Auto Trait Implementations§
impl !RefUnwindSafe for DnsResolver
impl !UnwindSafe for DnsResolver
impl Freeze for DnsResolver
impl Send for DnsResolver
impl Sync for DnsResolver
impl Unpin for DnsResolver
impl UnsafeUnpin for DnsResolver
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more