use serde_json::{Map, Value};
pub fn merge(base: &mut Value, override_val: Value) {
match (base, override_val) {
(Value::Object(base_map), Value::Object(override_map)) => {
for (k, v) in override_map {
merge(base_map.entry(k).or_insert(Value::Null), v);
}
}
(slot, v) => {
*slot = v;
}
}
}
pub fn insert_path(root: &mut Value, path: &[&str], value: Value) {
let (last_key, parents) = path.split_last().expect("path must not be empty");
let mut current = root;
for part in parents {
if !current.get(*part).is_some() {
if let Value::Object(map) = current {
map.insert((*part).to_string(), Value::Object(Map::new()));
} else {
let mut map = Map::new();
map.insert((*part).to_string(), Value::Object(Map::new()));
*current = Value::Object(map);
}
}
current = current
.as_object_mut()
.and_then(|map| map.get_mut(*part))
.unwrap();
}
if let Value::Object(map) = current {
map.insert(last_key.to_string(), value);
} else {
let mut map = Map::new();
map.insert(last_key.to_string(), value);
*current = Value::Object(map);
}
}