create_vue_business_rs/utils/
deep_merge.rs

1use serde_json::{json, Value};
2
3fn merge_array_with_dedupe(a: &Value, b: &Value) -> Value {
4    let mut result = Vec::new();
5
6    if let Value::Array(a) = a {
7        result.extend(a.iter().cloned());
8    }
9
10    if let Value::Array(b) = b {
11        result.extend(b.iter().cloned());
12    }
13
14    result.sort_by(|a, b| a.as_str().cmp(&b.as_str()));
15    result.dedup();
16
17    Value::Array(result)
18}
19
20pub fn merge(target: &Value, obj: &Value) -> Value {
21    let mut target = target.clone();
22    for key in obj.as_object().unwrap().keys() {
23        let old_val = {
24            if let Some(val) = target.get(key) {
25                val
26            } else {
27                &json!(null)
28            }
29        };
30        let new_val = obj.get(key).unwrap();
31
32        if old_val.is_array() && new_val.is_array() {
33            *target.get_mut(key).unwrap() = merge_array_with_dedupe(old_val, new_val);
34        } else if old_val.is_object() && new_val.is_object() {
35            *target.get_mut(key).unwrap() = merge(&old_val, &new_val);
36        } else {
37            if let Some(val) = target.get_mut(key) {
38                *val = new_val.clone();
39            } else {
40                target[key] = new_val.clone();
41            }
42        }
43    }
44    target.into()
45}