Skip to main content

macos_resolver/
config.rs

1//! Resolver entry configuration.
2
3/// Configuration for a single `/etc/resolver/<domain>` entry.
4///
5/// # Example
6///
7/// ```
8/// use macos_resolver::ResolverConfig;
9///
10/// let config = ResolverConfig::new("myapp.local", "127.0.0.1", 5553)
11///     .with_search_order(10);
12///
13/// assert_eq!(config.domain, "myapp.local");
14/// assert_eq!(config.port, 5553);
15/// assert_eq!(config.search_order, 10);
16/// ```
17#[derive(Debug, Clone)]
18pub struct ResolverConfig {
19    /// Domain suffix (e.g., `"myapp.local"`).
20    /// Becomes the filename under `/etc/resolver/`.
21    pub domain: String,
22
23    /// Nameserver IP address (e.g., `"127.0.0.1"`).
24    pub nameserver: String,
25
26    /// DNS port. Standard DNS uses 53; custom resolvers typically use a
27    /// high port (e.g., 5553) to avoid conflicts.
28    pub port: u16,
29
30    /// Search order — lower values are tried first.
31    pub search_order: u32,
32}
33
34impl ResolverConfig {
35    /// Creates a new resolver config with `search_order = 1`.
36    #[must_use]
37    pub fn new(domain: impl Into<String>, nameserver: impl Into<String>, port: u16) -> Self {
38        Self {
39            domain: domain.into(),
40            nameserver: nameserver.into(),
41            port,
42            search_order: 1,
43        }
44    }
45
46    /// Overrides the search order.
47    #[must_use]
48    pub const fn with_search_order(mut self, order: u32) -> Self {
49        self.search_order = order;
50        self
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn new_sets_defaults() {
60        let c = ResolverConfig::new("test.local", "127.0.0.1", 5553);
61        assert_eq!(c.domain, "test.local");
62        assert_eq!(c.nameserver, "127.0.0.1");
63        assert_eq!(c.port, 5553);
64        assert_eq!(c.search_order, 1);
65    }
66
67    #[test]
68    fn with_search_order() {
69        let c = ResolverConfig::new("x.local", "127.0.0.1", 53).with_search_order(10);
70        assert_eq!(c.search_order, 10);
71    }
72}