config/file/format/
toml.rs1use std::error::Error;
2
3use crate::map::Map;
4use crate::value::Value;
5
6pub(crate) fn parse(
7 uri: Option<&String>,
8 text: &str,
9) -> Result<Map<String, Value>, Box<dyn Error + Send + Sync>> {
10 let table = from_toml_table(uri, toml::from_str(text)?);
12 Ok(table)
13}
14
15fn from_toml_table(uri: Option<&String>, table: toml::Table) -> Map<String, Value> {
16 let mut m = Map::new();
17
18 for (key, value) in table {
19 m.insert(key, from_toml_value(uri, value));
20 }
21
22 m
23}
24
25fn from_toml_value(uri: Option<&String>, value: toml::Value) -> Value {
26 match value {
27 toml::Value::String(value) => Value::new(uri, value),
28 toml::Value::Float(value) => Value::new(uri, value),
29 toml::Value::Integer(value) => Value::new(uri, value),
30 toml::Value::Boolean(value) => Value::new(uri, value),
31
32 toml::Value::Table(table) => {
33 let m = from_toml_table(uri, table);
34 Value::new(uri, m)
35 }
36
37 toml::Value::Array(array) => {
38 let mut l = Vec::new();
39
40 for value in array {
41 l.push(from_toml_value(uri, value));
42 }
43
44 Value::new(uri, l)
45 }
46
47 toml::Value::Datetime(datetime) => Value::new(uri, datetime.to_string()),
48 }
49}