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