injection 0.1.1

A lightweight dependency injection container for Rust applications
Documentation
use serde_json::Value;

/// JSON Merge Patch 实现
/// 按照 RFC 7396 标准合并两个 JSON 值
/// 主要用于配置文件的合并,将配置文件的值与默认值进行合并
/// 
/// # 参数
/// * `target` - 目标 JSON 值(会被修改)
/// * `patch` - 补丁 JSON 值(用于合并到 target)
/// 
/// # 合并规则
/// 1. 如果两者都是对象,递归合并每个字段
/// 2. 如果 patch 中的值为 null,则从 target 中移除该字段(当前被注释)
/// 3. 如果 target 中有该字段,递归合并
/// 4. 如果 target 中没有该字段,直接插入
/// 5. 如果不都是对象,直接用 patch 替换 target
pub(crate) fn json_merge_patch(target: &mut Value, patch: &Value) {
    let is_both_objects = matches!(target, Value::Object(_)) && matches!(patch, Value::Object(_));
    if is_both_objects {
        if let (Value::Object(target_map), Value::Object(patch_map)) = (target, patch) {
            for (key, patch_value) in patch_map {
                if patch_value.is_null() {
                    // target_map.remove(key);
                } else if let Some(target_value) = target_map.get_mut(key) {
                    // 递归合并
                    json_merge_patch(target_value, patch_value);
                } else {
                    // target 中没有这个键,直接插入
                    target_map.insert(key.clone(), patch_value.clone());
                }
            }
        }
    } else {
        // 如果不都是对象,直接使用 patch 替换 target
        *target = patch.clone();
    }
}