create_vue_business_rs/utils/
deep_merge.rs1use 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}