Skip to main content

dnslib/control_plane/
app.rs

1use crate::control_plane::config::{AppConfig, DnsServerConfig};
2use crate::core::error::{Error, Result};
3
4/// Select the configured DNS servers that should be queried by a cross-server command.
5pub fn select_record_list_servers<'a>(
6    app_config: Option<&'a AppConfig>,
7    domain: Option<&str>,
8    zone: Option<&str>,
9    servers: &[String],
10) -> Result<Vec<&'a DnsServerConfig>> {
11    let Some(cfg) = app_config else {
12        return Err(Error::parse(
13            "--all/--server for record list requires a config file with server entries",
14        ));
15    };
16
17    let bare_label_without_zone =
18        zone.is_none() && domain.is_some_and(|domain| !domain.contains('.'));
19    let query_all_servers = servers.is_empty() && (domain.is_none() || bare_label_without_zone);
20    let selected: Vec<&DnsServerConfig> = if query_all_servers {
21        cfg.servers.iter().collect()
22    } else {
23        let mut picked = Vec::with_capacity(servers.len());
24        for server_id in servers {
25            picked.push(cfg.selected_server(Some(server_id.as_str()))?);
26        }
27        picked
28    };
29
30    if selected.is_empty() {
31        return Err(Error::parse(
32            "--all requested, but no servers are configured; add at least one server in the config file",
33        ));
34    }
35
36    Ok(selected)
37}