Skip to main content

trippy_dns/
config.rs

1use crate::{IpAddrFamily, ResolveMethod};
2use std::time::Duration;
3
4/// A builder for DNS `Config`.
5///
6/// # Example
7///
8/// Build a DNS `Config` for the `Ipv4Only` address family.
9///
10/// ```no_run
11/// use trippy_dns::{Builder, IpAddrFamily};
12///
13/// let config = Builder::new().addr_family(IpAddrFamily::Ipv4Only).build();
14pub struct Builder {
15    resolve_method: ResolveMethod,
16    addr_family: IpAddrFamily,
17    timeout: Duration,
18    ttl: Duration,
19}
20
21impl Builder {
22    /// Create a new `Builder`.
23    #[must_use]
24    pub fn new() -> Self {
25        Self {
26            resolve_method: Config::default().resolve_method,
27            addr_family: Config::default().addr_family,
28            timeout: Config::default().timeout,
29            ttl: Config::default().ttl,
30        }
31    }
32
33    /// Set the method to use for DNS resolution.
34    #[must_use]
35    pub const fn resolve_method(self, resolve_method: ResolveMethod) -> Self {
36        Self {
37            resolve_method,
38            ..self
39        }
40    }
41
42    /// Set the address family.
43    #[must_use]
44    pub const fn addr_family(self, addr_family: IpAddrFamily) -> Self {
45        Self {
46            addr_family,
47            ..self
48        }
49    }
50
51    /// Set the timeout for DNS resolution.
52    #[must_use]
53    pub const fn timeout(self, timeout: Duration) -> Self {
54        Self { timeout, ..self }
55    }
56
57    /// Set the time-to-live (TTL) for DNS cache entries.
58    #[must_use]
59    pub const fn ttl(self, ttl: Duration) -> Self {
60        Self { ttl, ..self }
61    }
62
63    /// Build the DNS `Config`.
64    #[must_use]
65    pub const fn build(self) -> Config {
66        Config {
67            resolve_method: self.resolve_method,
68            addr_family: self.addr_family,
69            timeout: self.timeout,
70            ttl: self.ttl,
71        }
72    }
73}
74
75impl Default for Builder {
76    fn default() -> Self {
77        Self::new()
78    }
79}
80
81/// Configuration for the `DnsResolver`.
82#[derive(Debug, Copy, Clone)]
83pub struct Config {
84    /// The method to use for DNS resolution.
85    pub resolve_method: ResolveMethod,
86    /// The IP address resolution family.
87    pub addr_family: IpAddrFamily,
88    /// The timeout for DNS resolution.
89    pub timeout: Duration,
90    /// The time-to-live (TTL) for DNS cache entries.
91    pub ttl: Duration,
92}
93
94impl Config {
95    /// Create a `Config`.
96    #[must_use]
97    pub const fn new(
98        resolve_method: ResolveMethod,
99        addr_family: IpAddrFamily,
100        timeout: Duration,
101        ttl: Duration,
102    ) -> Self {
103        Self {
104            resolve_method,
105            addr_family,
106            timeout,
107            ttl,
108        }
109    }
110}
111
112impl Default for Config {
113    fn default() -> Self {
114        Self {
115            resolve_method: ResolveMethod::System,
116            addr_family: IpAddrFamily::Ipv4thenIpv6,
117            timeout: Duration::from_millis(5000),
118            ttl: Duration::from_secs(300),
119        }
120    }
121}