chiark / gitweb /
wip parsing, record loc
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 23 Jul 2021 22:28:10 +0000 (23:28 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 23 Jul 2021 22:28:10 +0000 (23:28 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/config.rs
src/prelude.rs

index 31a0fb91b0ac15cd996a1d5b78497a9fce831ab9..66325b768088b8ee7d607d6df7383981050e5a4e 100644 (file)
@@ -67,7 +67,7 @@ pub enum SectionName {
 }
 pub use SectionName as SN;
 
-type SectionMap = HashMap<String, Option<String>>;
+type SectionMap = HashMap<String, (Option<String>, Arc<PathBuf>)>;
 
 pub struct Config {
   opts: Opts,
@@ -130,20 +130,21 @@ impl Aggregate {
     let mut ini = Ini::new_cs();
     ini.set_default_section(OUTSIDE_SECTION);
     ini.read(s).map_err(|e| anyhow!("{}", e)).context("parse as INI")?;
-    let mut map = mem::take(ini.get_mut_map());
+    let map = mem::take(ini.get_mut_map());
     if map.get(OUTSIDE_SECTION).is_some() {
       throw!(anyhow!("INI file contains settings outside a section"));
     }
 
-    // xxx parse section names here
-    // xxx save Arc<PathBuf> where we found each item
+    let loc = Arc::new(path.to_owned());
 
-    for (sn, vars) in map.drain() {
+    for (sn, vars) in map {
       let sn = sn.parse().dcontext(&sn)?;
-      Extend::extend(
-      self.sections.entry(sn)
-        .or_default(),
-        vars);
+        self.sections.entry(sn)
+        .or_default()
+        .extend(
+          vars.into_iter()
+            .map(|(k,v)| (k, (v, loc.clone())))
+        );
     }
     None
   }
index 18a4646bad85196e0cf1f9e334b5de0f68c622f7..bac8d9de3e3f98386479d5d43b62a9a19bebbe49 100644 (file)
@@ -10,6 +10,7 @@ pub use std::mem;
 pub use std::net::{IpAddr, Ipv4Addr};
 pub use std::path::{Path, PathBuf};
 pub use std::str::FromStr;
+pub use std::sync::Arc;
 
 pub use anyhow::{anyhow, Context};
 pub use extend::ext;