chiark / gitweb /
Config inspection: Move extra keys into trait
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 10 Jan 2023 20:37:22 +0000 (20:37 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 11 Jan 2023 02:12:41 +0000 (02:12 +0000)
This involves splitting the trait.  I've chosen the structure to
minimise work done by the macro.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
client/client.rs
macros/macros.rs
server/server.rs
src/config.rs

index 627a7995abbd032d9dba3f13803b67e7eed7b347..2f284c717ec182e83d3c81a2749108f6a7835d5e 100644 (file)
@@ -338,13 +338,7 @@ async fn main() {
   let opts = <Opts as clap::Parser>::parse();
   let (ics,) = config::startup("hippotat", LinkEnd::Client,
                                &opts.config, &opts.log, |ics| {
-    implement_print_config(&mut ics.iter(), &opts.print_config,
-                           &|ic, 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(), &opts.print_config)?;
 
     Ok((ics,))
   });
index 4303f00ef1282ad884414633813fd058684c0b80..d0104595b07249b3b8463c116567643f4db72a9d 100644 (file)
@@ -172,9 +172,9 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
                                top_ident.span());
 
   let mk_inspects = |self_, inspects: Vec<_>| quote! {
-    impl InspectableConfig for #self_ {
-      fn inspect_key(&self, field: &'_ str)
-                     -> Option<&dyn InspectableConfigValue> {
+    impl InspectableConfigAuto for #self_ {
+      fn inspect_key_auto(&self, field: &'_ str)
+                          -> Option<&dyn InspectableConfigValue> {
         Some(match field {
           #( #inspects )*
           _ => return None,
index 97aa32683ee767a84b64b59cff55637957632285..3a3643c9aecd4778aac996283502f865a3269824 100644 (file)
@@ -165,7 +165,7 @@ async fn async_main(opts: Opts, daemon: Option<Daemoniser>) {
     let global_config = config::InstanceConfigGlobal::from(&ics);
 
     implement_print_config(&mut iter::once(&global_config),
-                           &opts.print_config, &|_,__| None)?;
+                           &opts.print_config)?;
 
     if let Some(pidfile_path) = opts.pidfile.as_ref() {
       (||{
index 2d37d6e5c43c528e7647ab9199aa9eb0f1198396..711ede7c08c16a472b6f2e2bd36ad72da566e29b 100644 (file)
@@ -90,22 +90,43 @@ pub struct Opts {
   pub extra_config: Vec<PathBuf>,
 }
 
+pub trait InspectableConfigAuto {
+  fn inspect_key_auto(&self, field: &'_ str)
+                      -> Option<&dyn InspectableConfigValue>;
+}
 pub trait InspectableConfig: Debug {
   fn inspect_key(&self, field: &'_ str)
                  -> Option<&dyn InspectableConfigValue>;
 }
 
+impl InspectableConfig for InstanceConfigGlobal {
+  fn inspect_key(&self, field: &'_ str)
+                 -> Option<&dyn InspectableConfigValue> {
+    self.inspect_key_auto(field)
+  }
+}
+
+impl InspectableConfig for InstanceConfig {
+  fn inspect_key(&self, field: &'_ str)
+                 -> Option<&dyn InspectableConfigValue> {
+    Some(match field {
+      "link" => &self.link,
+      "server" => &self.link.server,
+      "client" => &self.link.client,
+      k => return self.inspect_key_auto(k),
+    })
+  }
+}
+
 #[throws(AE)]
-pub fn implement_print_config<'c, C: InspectableConfig>(
+pub fn implement_print_config<'c, C: InspectableConfig + 'c>(
   configs: impl Iterator<Item=&'c C>,
   arg: &Option<String>,
-  extra_key: &dyn Fn(&'c C, &str) -> Option<&'c dyn InspectableConfigValue>
 ) {
   #[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(',')
@@ -114,7 +135,6 @@ pub fn implement_print_config<'c, C: InspectableConfig>(
           return Ok(format!("{:#?}", &config));
         }
         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())
       })
@@ -125,7 +145,7 @@ pub fn implement_print_config<'c, C: InspectableConfig>(
 
   if let Some(arg) = arg {
     for config in configs {
-      print_one_config(config, arg, &|k| extra_key(config, k))?;
+      print_one_config(config, arg)?;
     }
     process::exit(0);
   }