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