summaryrefslogtreecommitdiffstats
path: root/src/file/format/ini.rs
blob: b7c0f71ac2cd429360355e1b0b8171cbe651cacc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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)
}