chiark / gitweb /
Config inspection: Introduce InspectableConfig trait
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 9 Jan 2023 18:56:40 +0000 (18:56 +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
src/config.rs
src/prelude.rs

index b03075656d12985f496dbcead81b1cb65cd3272e..341edb223e1ff9b98e6f7f318ac724dcd7655bd4 100644 (file)
@@ -169,16 +169,18 @@ 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 mk_inspects = |self_, inspects: Vec<_>| quote! {
+    impl InspectableConfig for #self_ {
+      fn inspect_key(&self, field: &'_ str)
+                     -> Option<&dyn InspectableConfigValue> {
+        Some(match field {
+          #( #inspects )*
+          _ => return None,
+        })
+      }
     }
   };
-  let g_inspects = mk_inspects(g_inspects);
+  let g_inspects = mk_inspects(&global, g_inspects);
 
   let output = quote! {
     impl #target {
@@ -203,9 +205,9 @@ pub fn resolve(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
       pub fn from(l: &[#top_ident]) -> #global { #global {
         #( #global_assignments )*
       } }
-
-      #g_inspects
     }
+
+    #g_inspects
   };
 
   //eprintln!("{}", &output);
index b659ceb66822635e9188bd236a3b8db4327c4264..7cc9adf8d9bc919624db43adebf27909a1be8389 100644 (file)
@@ -90,6 +90,11 @@ pub struct Opts {
   pub extra_config: Vec<PathBuf>,
 }
 
+pub trait InspectableConfig {
+  fn inspect_key(&self, field: &'_ str)
+                 -> Option<&dyn InspectableConfigValue>;
+}
+
 pub trait InspectableConfigValue {
   fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result;
 }
index 2570fcb31a871f2cb84ca18d8ecf6653b8d494af..e38c3d5585b3eefc98a6ea0e2298f4558e7bd170 100644 (file)
@@ -55,7 +55,8 @@ pub use eyre::eyre as anyhow;
 pub use eyre::WrapErr;
 pub use eyre::Error as AE;
 
-pub use crate::config::{self, InspectableConfigValue, InstanceConfig};
+pub use crate::config::{self, InstanceConfig};
+pub use crate::config::{InspectableConfig, InspectableConfigValue};
 pub use crate::config::{DisplayInspectable, U32Ext as _};
 pub use crate::impl_inspectable_config_value;
 pub use crate::ini;