summaryrefslogtreecommitdiffstats
path: root/src/file/format/ini.rs
diff options
context:
space:
mode:
authorsaber.wu <saber.wu@trantect.com>2018-06-14 17:09:43 +0800
committersaber.wu <saber.wu@trantect.com>2018-06-15 11:13:53 +0800
commitba6014543dfb4040921bb4809c6b293cfdf33c84 (patch)
tree523708c74eb31e5c861c7e474f092fafbd416879 /src/file/format/ini.rs
parente8fa9fee96185ddd18ebcef8a925c75459111edb (diff)
support ini
Diffstat (limited to 'src/file/format/ini.rs')
-rw-r--r--src/file/format/ini.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/file/format/ini.rs b/src/file/format/ini.rs
new file mode 100644
index 0000000..b7c0f71
--- /dev/null
+++ b/src/file/format/ini.rs
@@ -0,0 +1,32 @@
+use source::Source;
+use std::collections::HashMap;
+use std::error::Error;
+use value::{Value, ValueKind};
+use ini::Ini;
+
+pub fn parse(
+ uri: Option<&String>,
+ text: &str,
+) -> Result<HashMap<String, Value>, Box<Error + Send + Sync>> {
+ let mut map: HashMap<String, Value> = HashMap::new();
+ let i = Ini::load_from_str(text)?;
+ for (sec, prop) in i.iter() {
+ match *sec {
+ Some(ref sec) => {
+ let mut sec_map: HashMap<String, Value> = HashMap::new();
+ for (k, v) in prop.iter() {
+ sec_map.insert(k.to_lowercase().clone(),
+ Value::new(uri, ValueKind::String(v.clone())));
+ }
+ map.insert(sec.to_lowercase().clone(), Value::new(uri, ValueKind::Table(sec_map)));
+ }
+ None => {
+ for (k, v) in prop.iter() {
+ map.insert(k.to_lowercase().clone(),
+ Value::new(uri, ValueKind::String(v.clone())));
+ }
+ }
+ }
+ }
+ Ok(map)
+}