From: Ian Jackson Date: Mon, 9 Jan 2023 18:41:30 +0000 (+0000) Subject: Config inspection: Preparatory reorganisation X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=2739081ad56cde2030d89bf56efeac5970a6dbd3;p=hippotat.git Config inspection: Preparatory reorganisation Signed-off-by: Ian Jackson --- diff --git a/macros/macros.rs b/macros/macros.rs index ba2fc8e..b030756 100644 --- a/macros/macros.rs +++ b/macros/macros.rs @@ -90,7 +90,7 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let mut output = vec![]; let mut global_fields = vec![]; let mut global_assignments = vec![]; - let mut inspects = vec![]; + let mut g_inspects = vec![]; for field in &fields.named { //dbg!(field); let fname = &field.ident.as_ref().unwrap(); @@ -109,6 +109,9 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { for attr in &field.attrs { let atspan = attr.path.segments.last().unwrap().ident.span(); if attr.tokens.is_empty() { + let inspect = quote!{ + #fname_lit => &self.#fname, + }; if attr.path == parse_quote!{ per_client } { set_skl(quote_spanned!{fname_span=> SectionKindList::PerClient }); continue; @@ -122,9 +125,7 @@ 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, - }); + g_inspects.push(inspect); continue; } method = attr.path.to_token_stream(); @@ -168,6 +169,17 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let global = syn::Ident::new(&format!("{}Global", top_ident), top_ident.span()); + let mk_inspects = |inspects: Vec<_>| quote! { + pub fn inspect_key(&self, field: &'_ str) + -> Option<&dyn InspectableConfigValue> { + Some(match field { + #( #inspects )* + _ => return None, + }) + } + }; + let g_inspects = mk_inspects(g_inspects); + let output = quote! { impl #target { const FIELDS: &'static [(&'static str, SectionKindList)] @@ -192,13 +204,7 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream { #( #global_assignments )* } } - pub fn inspect_key(&self, field: &'_ str) - -> Option<&dyn InspectableConfigValue> { - Some(match field { - #( #inspects )* - _ => return None, - }) - } + #g_inspects } };