1use toml::Value;
2
3pub fn merge(merged: &mut Value, value: &Value) {
4 match value {
5 toml::Value::String(_)
6 | toml::Value::Integer(_)
7 | toml::Value::Float(_)
8 | toml::Value::Boolean(_)
9 | toml::Value::Datetime(_) => *merged = value.clone(),
10 toml::Value::Array(x) => match merged {
11 toml::Value::Array(merged) => {
12 for (k, v) in x.iter().enumerate() {
13 match merged.get_mut(k) {
14 Some(x) => merge(x, v),
15 None => {
16 merged.insert(k, v.clone());
17 }
18 }
19 }
20 }
21 _ => *merged = value.clone(),
22 },
23 toml::Value::Table(x) => match merged {
24 toml::Value::Table(merged) => {
25 for (k, v) in x.iter() {
26 match merged.get_mut(k) {
27 Some(x) => merge(x, v),
28 None => {
29 let _ = merged.insert(k.clone(), v.clone());
30 }
31 }
32 }
33 }
34 _ => *merged = value.clone(),
35 },
36 }
37}
38
39#[test]
40fn test() {
41 let a = "[a]
42b=1
43c=\"x\"
44f=3
45";
46 let b = "[a]
47d=3
48e=2
49f=true";
50
51 let mut a = a.parse().unwrap();
52 let b = b.parse().unwrap();
53 merge(&mut a, &b);
54 let a = toml::ser::to_string_pretty(&a).unwrap();
55 assert_eq!(
56 a,
57 "[a]
58b = 1
59c = \"x\"
60d = 3
61e = 2
62f = true
63"
64 )
65}