}
pub use SectionName as SN;
-type SectionMap = HashMap<String, Option<String>>;
+type SectionMap = HashMap<String, (Option<String>, Arc<PathBuf>)>;
pub struct Config {
opts: Opts,
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
}
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;