diffx_core/parser/
toml.rs

1use 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}