use crab_vault::engine::error::{EngineError, EngineResult};
pub fn merge_json_object(
new: serde_json::Value,
old: serde_json::Value,
) -> EngineResult<serde_json::Value> {
use serde_json::Value;
let ensure_is_object_and_take_the_map = |value: Value| match value {
Value::Object(map) => Ok(map),
_ => Err(EngineError::InvalidArgument(
"Should be an object".to_string(),
)),
};
let new_map = ensure_is_object_and_take_the_map(new)?;
let mut old = match ensure_is_object_and_take_the_map(old) {
Err(_) => return Ok(Value::Object(new_map)),
Ok(old) => old,
};
for (k, v) in new_map {
match v {
Value::Null => old.remove(&k),
_ => old.insert(k, v),
};
}
Ok(Value::Object(old))
}