chiark / gitweb /
Config inspection: Centralise loop
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 10 Jan 2023 01:39:02 +0000 (01:39 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 11 Jan 2023 02:12:41 +0000 (02:12 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
client/client.rs
server/server.rs
src/config.rs

index 7aaebfb2b8339665a2bdcfed836468df9764dd3e..b7d9d1e167bba034fe77b642f5b00712cc874399 100644 (file)
@@ -344,14 +344,12 @@ async fn main() {
       process::exit(0);
     }
     if let Some(arg) = &opts.print_config {
-      for ic in &ics {
-        implement_print_config(ic, arg, &|k| Some(match k {
-          "link" => &ic.link,
-          "server" => &ic.link.server,
-          "client" => &ic.link.client,
-          k => return ic.inspect_key(k),
-        }))?;
-      }
+      implement_print_config(&mut ics.iter(), arg, &|ic, k| Some(match k {
+        "link" => &ic.link,
+        "server" => &ic.link.server,
+        "client" => &ic.link.client,
+        k => return ic.inspect_key(k),
+      }))?;
       process::exit(0);
     }
 
index 231e8ef5c6618a5a6ea5a81b08922c2a87cf2165..15ba532fe3278aedfe213f2862d53eeca2357b2a 100644 (file)
@@ -161,7 +161,8 @@ async fn async_main(opts: Opts, daemon: Option<Daemoniser>) {
     let global_config = config::InstanceConfigGlobal::from(&ics);
 
     if let Some(arg) = &opts.print_config {
-      implement_print_config(&global_config, arg, &|_| None)?;
+      implement_print_config(&mut iter::once(&global_config),
+                             arg, &|_,__| None)?;
       process::exit(0);
     }
 
index 8f95a5c0775b1266dc298c5b2ff8b20cf753f102..eab88152a5f6b14776fc0b619b67c44ac9196402 100644 (file)
@@ -96,22 +96,33 @@ pub trait InspectableConfig: Debug {
 }
 
 #[throws(AE)]
-pub fn implement_print_config<'f>(
-  config: &dyn InspectableConfig,
+pub fn implement_print_config<'c, C: InspectableConfig>(
+  configs: impl Iterator<Item=&'c C>,
   arg: &str,
-  extra_key: &dyn Fn(&str) -> Option<&'f dyn InspectableConfigValue>
+  extra_key: &dyn Fn(&'c C, &str) -> Option<&'c dyn InspectableConfigValue>
 ) {
-  let output = arg
-    .split(',')
-    .map(|key| {
-      let insp = config.inspect_key(key)
-        .or_else(|| extra_key(key))
-        .ok_or_else(|| anyhow!("unknown config key {:?}", key))?;
-      Ok::<_,AE>(DisplayInspectable(insp).to_string())
-    })
-    .collect::<Result<Vec<_>,_>>()?
-    .join(" ");
-  println!("{}",  output);
+  #[throws(AE)]
+  pub fn print_one_config<'f>(
+    config: &dyn InspectableConfig,
+    arg: &str,
+    extra_key: &dyn Fn(&str) -> Option<&'f dyn InspectableConfigValue>
+  ) {
+    let output = arg
+      .split(',')
+      .map(|key| {
+        let insp = config.inspect_key(key)
+          .or_else(|| extra_key(key))
+          .ok_or_else(|| anyhow!("unknown config key {:?}", key))?;
+        Ok::<_,AE>(DisplayInspectable(insp).to_string())
+      })
+      .collect::<Result<Vec<_>,_>>()?
+      .join(" ");
+    println!("{}",  output);
+  }
+
+  for config in configs {
+    print_one_config(config, arg, &|k| extra_key(config, k))?;
+  }
 }
 
 pub trait InspectableConfigValue {