dnslib/control_plane/
app.rs1use crate::control_plane::config::{AppConfig, DnsServerConfig};
2use crate::core::error::{Error, Result};
3
4pub 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}