refactor: drop config_count from merge_forwarding_rules return

Log config rules directly from config.forwarding before merging,
keeping the merge API clean of logging concerns.
This commit is contained in:
Razvan Dimescu
2026-04-12 05:34:55 +03:00
parent 5043d4612e
commit 8d70d0df8a
2 changed files with 12 additions and 18 deletions

View File

@@ -56,19 +56,16 @@ impl ForwardingRuleConfig {
} }
} }
/// Merge config-declared rules with auto-discovered rules. Config rules come
/// first so `match_forwarding_rule`'s first-match semantics gives them precedence.
pub fn merge_forwarding_rules( pub fn merge_forwarding_rules(
config_rules: &[ForwardingRuleConfig], config_rules: &[ForwardingRuleConfig],
discovered: Vec<crate::system_dns::ForwardingRule>, discovered: Vec<crate::system_dns::ForwardingRule>,
) -> Result<(Vec<crate::system_dns::ForwardingRule>, usize)> { ) -> Result<Vec<crate::system_dns::ForwardingRule>> {
let mut merged: Vec<crate::system_dns::ForwardingRule> = Vec::new(); let mut merged: Vec<crate::system_dns::ForwardingRule> = Vec::new();
for rule in config_rules { for rule in config_rules {
merged.extend(rule.to_runtime_rules()?); merged.extend(rule.to_runtime_rules()?);
} }
let config_count = merged.len();
merged.extend(discovered); merged.extend(discovered);
Ok((merged, config_count)) Ok(merged)
} }
#[derive(Deserialize)] #[derive(Deserialize)]
@@ -740,8 +737,7 @@ mod tests {
"home.local".to_string(), "home.local".to_string(),
"192.168.1.1:53".parse().unwrap(), "192.168.1.1:53".parse().unwrap(),
)]; )];
let (merged, count) = merge_forwarding_rules(&config_rules, discovered).unwrap(); let merged = merge_forwarding_rules(&config_rules, discovered).unwrap();
assert_eq!(count, 1);
let picked = crate::system_dns::match_forwarding_rule("host.home.local", &merged) let picked = crate::system_dns::match_forwarding_rule("host.home.local", &merged)
.expect("rule should match"); .expect("rule should match");
assert_eq!(picked.to_string(), "10.0.0.1:53"); assert_eq!(picked.to_string(), "10.0.0.1:53");
@@ -757,7 +753,7 @@ mod tests {
"corp.example".to_string(), "corp.example".to_string(),
"192.168.1.1:53".parse().unwrap(), "192.168.1.1:53".parse().unwrap(),
)]; )];
let (merged, _) = merge_forwarding_rules(&config_rules, discovered).unwrap(); let merged = merge_forwarding_rules(&config_rules, discovered).unwrap();
assert_eq!(merged.len(), 2); assert_eq!(merged.len(), 2);
let picked = crate::system_dns::match_forwarding_rule("host.corp.example", &merged) let picked = crate::system_dns::match_forwarding_rule("host.corp.example", &merged)
.expect("discovered rule should still match"); .expect("discovered rule should still match");
@@ -765,13 +761,12 @@ mod tests {
} }
#[test] #[test]
fn forwarding_merge_suffix_array_expands_config_count() { fn forwarding_merge_suffix_array_expands_to_multiple_rules() {
let config_rules = vec![ForwardingRuleConfig { let config_rules = vec![ForwardingRuleConfig {
suffix: vec!["a.local".to_string(), "b.local".to_string()], suffix: vec!["a.local".to_string(), "b.local".to_string()],
upstream: "10.0.0.1:53".to_string(), upstream: "10.0.0.1:53".to_string(),
}]; }];
let (merged, count) = merge_forwarding_rules(&config_rules, vec![]).unwrap(); let merged = merge_forwarding_rules(&config_rules, vec![]).unwrap();
assert_eq!(count, 2);
assert_eq!(merged.len(), 2); assert_eq!(merged.len(), 2);
} }
} }

View File

@@ -210,14 +210,13 @@ async fn main() -> numa::Result<()> {
} }
service_store.load_persisted(); service_store.load_persisted();
let (forwarding_rules, config_count) = for fwd in &config.forwarding {
numa::config::merge_forwarding_rules(&config.forwarding, system_dns.forwarding_rules)?; for suffix in &fwd.suffix {
for rule in forwarding_rules.iter().take(config_count) { info!("forwarding .{} to {} (config rule)", suffix, fwd.upstream);
info!( }
"forwarding .{} to {} (config rule)",
rule.suffix, rule.upstream
);
} }
let forwarding_rules =
numa::config::merge_forwarding_rules(&config.forwarding, system_dns.forwarding_rules)?;
// Resolve data_dir from config, falling back to the platform default. // Resolve data_dir from config, falling back to the platform default.
// Used for TLS CA storage below and stored on ServerCtx for runtime use. // Used for TLS CA storage below and stored on ServerCtx for runtime use.