chiark / gitweb /
config: check key sections
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 24 Jul 2021 18:55:55 +0000 (19:55 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 24 Jul 2021 18:55:55 +0000 (19:55 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/config.rs

index 28b275419742c39a955a59a7f5a4eb6b1d1bbcc0..34b9a0c838343a19cf1f3985345d08a3f58afbc9 100644 (file)
@@ -153,6 +153,7 @@ static SPECIAL_SERVER_SECTION: &str = "SERVER";
 
 #[derive(Default,Debug)]
 struct Aggregate {
+  keys_allowed: HashMap<&'static str, SectionKindList>,
   sections: HashMap<SectionName, SectionMap>,
 }
 
@@ -234,9 +235,18 @@ impl Aggregate {
     let loc = Arc::new(path_for_loc.to_owned());
 
     for (sn, vars) in map {
-      //dbg!( InstanceConfig::FIELDS );// check xxx vars are in fields
-
       let sn = sn.parse().dcontext(&sn)?;
+
+      for key in vars.keys() {
+        let skl = self.keys_allowed.get(key.as_str()).ok_or_else(
+          || anyhow!("unknown configuration key {:?}", key)
+        )?;
+        if ! skl.contains(&sn) {
+          throw!(anyhow!("configuration key {:?} not applicable \
+                          in this kind of section {:?}", key, &sn))
+        }
+      }
+
       let ent = self.sections.entry(sn).or_default();
       for (key, raw) in vars {
         let raw = match raw {
@@ -678,6 +688,9 @@ pub fn read(end: LinkEnd) -> Vec<InstanceConfig> {
 
   let agg = (||{
     let mut agg = Aggregate::default();
+    agg.keys_allowed.extend(
+      InstanceConfig::FIELDS.iter().cloned()
+    );
 
     agg.read_string(DEFAULT_CONFIG.into(),
                     "<build-in defaults>".as_ref()).unwrap();