chiark / gitweb /
Config inspection: Preparatory reorganisation
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 9 Jan 2023 18:41:30 +0000 (18:41 +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>
macros/macros.rs

index ba2fc8eda6308c781e4d9f1b9eb8cc5ed5218a2f..b03075656d12985f496dbcead81b1cb65cd3272e 100644 (file)
@@ -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
     }
   };