1 use std::error::Error;
2
3 use ini::Ini;
4
5 use crate::map::Map;
6 use crate::value::{Value, ValueKind};
7
parse( uri: Option<&String>, text: &str, ) -> Result<Map<String, Value>, Box<dyn Error + Send + Sync>>8 pub fn parse(
9 uri: Option<&String>,
10 text: &str,
11 ) -> Result<Map<String, Value>, Box<dyn Error + Send + Sync>> {
12 let mut map: Map<String, Value> = Map::new();
13 let i = Ini::load_from_str(text)?;
14 for (sec, prop) in i.iter() {
15 match sec {
16 Some(sec) => {
17 let mut sec_map: Map<String, Value> = Map::new();
18 for (k, v) in prop.iter() {
19 sec_map.insert(
20 k.to_owned(),
21 Value::new(uri, ValueKind::String(v.to_owned())),
22 );
23 }
24 map.insert(sec.to_owned(), Value::new(uri, ValueKind::Table(sec_map)));
25 }
26 None => {
27 for (k, v) in prop.iter() {
28 map.insert(
29 k.to_owned(),
30 Value::new(uri, ValueKind::String(v.to_owned())),
31 );
32 }
33 }
34 }
35 }
36 Ok(map)
37 }
38