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

index 18e49698cd5538c2039577fe37d5003987fb6988..65877dbefe792b27d0d1713b570630e25541b519 100644 (file)
@@ -224,17 +224,32 @@ impl Aggregate {
       //dbg!( InstanceConfig::FIELDS );// check xxx vars are in fields
 
       let sn = sn.parse().dcontext(&sn)?;
-        self.sections.entry(sn)
-        .or_default()
-        .extend(
-          vars.into_iter()
-            .map(|(k,raw)| {
-              (k.replace('-',"_"),
-               RawVal { raw, loc: loc.clone() })
-            })
-        );
+      let ent = self.sections.entry(sn).or_default();
+      for (key, raw) in vars {
+        let raw = match raw {
+          Some(raw) if raw.starts_with('\'') || raw.starts_with('"') => Some(
+            (||{
+              if raw.contains('\\') {
+                throw!(
+                  anyhow!("quoted value contains backslash, not supported")
+                );
+              }
+              let unq = raw[1..].strip_suffix(&raw[0..1])
+                .ok_or_else(
+                  || anyhow!("mismatched quotes around quoted value")
+                )?
+                .to_owned();
+              Ok::<_,AE>(unq)
+            })()
+              .with_context(|| format!("key {:?}", key))
+              .dcontext(path_for_loc)?
+          ),
+          x => x,
+        };
+        let key = key.replace('-',"_");
+        ent.insert(key, RawVal { raw, loc: loc.clone() });
+      }
     }
-    
   }
 
   #[throws(AE)] // AE includes path