json_template/json/
mod.rs

1//! JSON utilities.
2
3use serde_json::Value;
4
5/// JSON utilities.
6pub trait JSON {
7    /// Text without quotes (specially for strings).
8    fn to_text(&self) -> String;
9
10    /// Add a value recursively.
11    fn add_recursive(&mut self, new_value: Value);
12
13    /// Override a value recursively.
14    fn override_recursive(&mut self, new_value: Value);
15}
16
17impl JSON for Value {
18    fn to_text(&self) -> String {
19        if let serde_json::Value::String(value) = self {
20            value.clone()
21        } else {
22            self.to_string()
23        }
24    }
25
26    fn add_recursive(&mut self, new_value: Value) {
27        let value = self;
28        match value {
29            Value::Object(map) => {
30                if let Value::Object(new_map) = new_value {
31                    for (key, new_value) in new_map {
32                        if let Some(value) = map.get_mut(&key) {
33                            value.add_recursive(new_value);
34                        } else {
35                            map.insert(key, new_value);
36                        }
37                    }
38                }
39            }
40            Value::Array(array) => {
41                if let Value::Array(new_array) = new_value {
42                    for new_value in new_array.into_iter() {
43                        array.push(new_value);
44                    }
45                }
46            }
47            _ => *value = new_value
48        }
49    }
50
51    fn override_recursive(&mut self, new_value: Value) {
52        let value = self;
53        match value {
54            Value::Object(map) => {
55                if let Value::Object(new_map) = new_value {
56                    for (key, new_value) in new_map {
57                        if let Some(value) = map.get_mut(&key) {
58                            value.override_recursive(new_value);
59                        } else {
60                            map.insert(key, new_value);
61                        }
62                    }
63                }
64            }
65            Value::Array(array) => {
66                if let Value::Array(new_array) = new_value {
67                    for (index, new_value) in new_array.into_iter().enumerate() {
68                        if let Some(value) = array.get_mut(index) {
69                            value.override_recursive(new_value);
70                        } else {
71                            array.push(new_value);
72                        }
73                    }
74                }
75            }
76            _ => *value = new_value
77        }
78    }
79}