Skip to main content

robinpath_modules/
serde_convert.rs

1use robinpath::Value;
2
3/// Convert a `serde_json::Value` into a `robinpath::Value`.
4pub fn json_to_value(v: serde_json::Value) -> Value {
5    match v {
6        serde_json::Value::Null => Value::Null,
7        serde_json::Value::Bool(b) => Value::Bool(b),
8        serde_json::Value::Number(n) => Value::Number(n.as_f64().unwrap_or(0.0)),
9        serde_json::Value::String(s) => Value::String(s),
10        serde_json::Value::Array(arr) => {
11            Value::Array(arr.into_iter().map(json_to_value).collect())
12        }
13        serde_json::Value::Object(obj) => {
14            let mut map = indexmap::IndexMap::new();
15            for (k, v) in obj {
16                map.insert(k, json_to_value(v));
17            }
18            Value::Object(map)
19        }
20    }
21}
22
23/// Convert a `robinpath::Value` into a `serde_json::Value`.
24pub fn value_to_json(v: &Value) -> serde_json::Value {
25    match v {
26        Value::Null => serde_json::Value::Null,
27        Value::Bool(b) => serde_json::Value::Bool(*b),
28        Value::Number(n) => serde_json::json!(*n),
29        Value::String(s) => serde_json::Value::String(s.clone()),
30        Value::Array(arr) => {
31            serde_json::Value::Array(arr.iter().map(value_to_json).collect())
32        }
33        Value::Object(obj) => {
34            let mut map = serde_json::Map::new();
35            for (k, v) in obj {
36                map.insert(k.clone(), value_to_json(v));
37            }
38            serde_json::Value::Object(map)
39        }
40        _ => serde_json::Value::String(v.to_display_string()),
41    }
42}