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,))
});
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,
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(',')
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())
})
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);
}