diffx_core/parser/
toml.rs1use anyhow::{anyhow, Result};
2use serde_json::Value;
3
4pub fn parse_toml(content: &str) -> Result<Value> {
5 let toml_value: toml::Value = content.parse()?;
6 toml_to_json_value(toml_value)
7}
8
9fn toml_to_json_value(toml_val: toml::Value) -> Result<Value> {
10 match toml_val {
11 toml::Value::String(s) => Ok(Value::String(s)),
12 toml::Value::Integer(i) => Ok(Value::Number(i.into())),
13 toml::Value::Float(f) => Ok(Value::Number(
14 serde_json::Number::from_f64(f).ok_or_else(|| anyhow!("Invalid float"))?,
15 )),
16 toml::Value::Boolean(b) => Ok(Value::Bool(b)),
17 toml::Value::Array(arr) => {
18 let mut json_arr = Vec::new();
19 for item in arr {
20 json_arr.push(toml_to_json_value(item)?);
21 }
22 Ok(Value::Array(json_arr))
23 }
24 toml::Value::Table(table) => {
25 let mut json_obj = serde_json::Map::new();
26 for (key, value) in table {
27 json_obj.insert(key, toml_to_json_value(value)?);
28 }
29 Ok(Value::Object(json_obj))
30 }
31 toml::Value::Datetime(dt) => Ok(Value::String(dt.to_string())),
32 }
33}