summaryrefslogtreecommitdiffstats
path: root/src/file/format/ini.rs
diff options
context:
space:
mode:
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)
+}