From: Ian Jackson Date: Sun, 25 Sep 2022 18:57:23 +0000 (+0100) Subject: print config value X-Git-Tag: hippotat/1.0.0~25 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=893e23b3dd3afbd5060eb43bb4d78ee895715094;p=hippotat.git print config value Signed-off-by: Ian Jackson --- diff --git a/macros/macros.rs b/macros/macros.rs index 1a158a7..22b778d 100644 --- a/macros/macros.rs +++ b/macros/macros.rs @@ -83,6 +83,8 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { for field in &fields.named { //dbg!(field); let fname = &field.ident.as_ref().unwrap(); + let fname_string = fname.to_string(); + let fname_lit = Literal::string( &fname_string ); let ty = &field.ty; let fname_span = fname.span(); let skl = RefCell::new(None); @@ -109,6 +111,9 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { #fname: <#ty as ResolveGlobal>::resolve (l.iter().map(|e| &e.#fname)), )); + inspects.push(quote!{ + #fname_lit => &self.#fname, + }); continue; } method = attr.path.to_token_stream(); @@ -135,8 +140,6 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { *skl.borrow_mut() = Some(get_path(tskl)); } } - let fname_string = fname.to_string(); - let fname_lit = Literal::string( &fname_string ); let skl = skl.into_inner() .expect(&format!("SKL not specified! (field {})!", fname)); @@ -147,9 +150,6 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { output.push(quote!{ #fname: rctx. #method ( #fname_lit, #skl )?, }); - inspects.push(quote!{ - #fname_lit => &self.#fname, - }); //eprintln!("{:?} method={:?} skl={:?}", field.ident, method, skl); } //dbg!(&output); @@ -169,14 +169,6 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { #( #output )* }) } - - pub fn inspect_key(&self, field: &'_ str) - -> Option<&dyn InspectableConfigValue> { - Some(match field { - #( #inspects )* - _ => return None, - }) - } } #[derive(Debug)] @@ -188,6 +180,14 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { pub fn from(l: &[#top_ident]) -> #global { #global { #( #global_assignments )* } } + + pub fn inspect_key(&self, field: &'_ str) + -> Option<&dyn InspectableConfigValue> { + Some(match field { + #( #inspects )* + _ => return None, + }) + } } }; diff --git a/server/server.rs b/server/server.rs index 02af6f8..05796d0 100644 --- a/server/server.rs +++ b/server/server.rs @@ -24,6 +24,10 @@ pub struct Opts { /// Daemonise #[structopt(long)] daemon: bool, + + /// Print a config item, do not actually run + #[structopt(long)] + print_config: Option, } pub const METADATA_MAX_LEN: usize = MAX_OVERHEAD; @@ -123,7 +127,7 @@ pub async fn route_packet(global: &Global, fn main() { let opts = Opts::from_args(); - let daemon = if opts.daemon { + let daemon = if opts.daemon && opts.print_config.is_none() { Some(Daemoniser::phase1()) } else { None @@ -145,6 +149,15 @@ async fn async_main(opts: Opts, daemon: Option) { { let global_config = config::InstanceConfigGlobal::from(&ics); + if let Some(key) = opts.print_config.as_ref() { + if let Some(inspectable) = global_config.inspect_key(key) { + println!("{}", DisplayInspectable(inspectable)); + process::exit(0); + } else { + throw!(anyhow!("unknown config key {:?}", key)); + } + } + let ipif = Ipif::start(&global_config.ipif, None)?; let ics = ics.into_iter().map(Arc::new).collect_vec(); diff --git a/src/config.rs b/src/config.rs index f3dfe49..90f2296 100644 --- a/src/config.rs +++ b/src/config.rs @@ -88,10 +88,6 @@ pub struct Opts { /// Additional config files or dirs, which can override the others #[structopt(long, multiple=true, number_of_values=1)] pub extra_config: Vec, - - /// Print configuration rather than running - #[structopt(long)] - pub print_config: bool, } pub trait InspectableConfigValue { @@ -121,6 +117,13 @@ macro_rules! impl_inspectable_config_value { }; } +pub struct DisplayInspectable<'i>(pub &'i dyn InspectableConfigValue); +impl<'i> Display for DisplayInspectable<'i> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + InspectableConfigValue::fmt(self.0, f) + } +} + impl_inspectable_config_value!{ String as Display } impl_inspectable_config_value!{ u16 as Display } impl_inspectable_config_value!{ u32 as Display } diff --git a/src/prelude.rs b/src/prelude.rs index 35e012e..a692d06 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -56,7 +56,7 @@ pub use eyre::WrapErr; pub use eyre::Error as AE; pub use crate::config::{self, InspectableConfigValue, InstanceConfig}; -pub use crate::config::u32Ext as _; +pub use crate::config::{DisplayInspectable, u32Ext as _}; pub use crate::impl_inspectable_config_value; pub use crate::ini; pub use crate::ipif::Ipif;