Deep-merge `extra` into `root`: objects merge recursively, arrays union by value (no duplicates), scalars overwrite. Used for non-hook settings such as Claude's `permissions.deny` rule.
(root: &mut Map<String, Value>, extra: &Map<String, Value>)
| 315 | /// value (no duplicates), scalars overwrite. Used for non-hook settings such |
| 316 | /// as Claude's `permissions.deny` rule. |
| 317 | fn deep_merge(root: &mut Map<String, Value>, extra: &Map<String, Value>) { |
| 318 | for (key, value) in extra { |
| 319 | match root.get_mut(key) { |
| 320 | Some(existing) => merge_value(existing, value), |
| 321 | None => { |
| 322 | root.insert(key.clone(), value.clone()); |
| 323 | } |
| 324 | } |
| 325 | } |
| 326 | } |
| 327 | |
| 328 | fn merge_value(target: &mut Value, source: &Value) { |
| 329 | match (target, source) { |
no test coverage detected