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 33 34 35 36 37 38 39
use ini::Ini; use source::Source; use std::collections::HashMap; use std::error::Error; use value::{Value, ValueKind}; 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.clone(), Value::new(uri, ValueKind::String(v.clone())), ); } map.insert( sec.clone(), Value::new(uri, ValueKind::Table(sec_map)), ); } None => { for (k, v) in prop.iter() { map.insert( k.clone(), Value::new(uri, ValueKind::String(v.clone())), ); } } } } Ok(map) }