cli_env_toml/
merge.rs

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}