1use std::collections::BTreeMap;
2
3pub fn flatten_json(
4 prefix: &str,
5 value: &serde_json::Value,
6) -> BTreeMap<String, serde_json::Value> {
7 let mut out = BTreeMap::new();
8 match value {
9 serde_json::Value::Object(map) => {
10 for (k, v) in map {
11 let key = format!("{}/{}", prefix, k);
12 out.extend(flatten_json(&key, v));
13 }
14 }
15 serde_json::Value::Array(arr) => {
16 for (idx, v) in arr.iter().enumerate() {
17 let key = format!("{}/{}", prefix, idx);
18 out.extend(flatten_json(&key, v));
19 }
20 }
21 _ => {
22 out.insert(prefix.to_string(), value.clone());
23 }
24 }
25 out
26}
27
28pub fn extract_scalars(flat: &BTreeMap<String, serde_json::Value>) -> Vec<(String, f64)> {
29 flat.iter()
30 .filter_map(|(k, v)| match v {
31 serde_json::Value::Number(n) => n.as_f64().map(|f| (k.clone(), f)),
32 serde_json::Value::Bool(b) => Some((k.clone(), if *b { 1.0 } else { 0.0 })),
33 _ => None,
34 })
35 .collect()
36}