1pub trait GraphState: Sized + Send + Sync + 'static {
7 type Update: Default + Send + 'static;
9
10 fn apply(&mut self, update: Self::Update);
12
13 fn reset_ephemeral(&mut self) {}
19}
20
21#[doc(hidden)]
31pub fn __merge_json(target: &mut serde_json::Value, source: serde_json::Value) {
32 use serde_json::Value;
33 match (target, source) {
34 (Value::Object(t_map), Value::Object(s_map)) => {
35 for (k, v) in s_map {
36 __merge_json(t_map.entry(k).or_insert(Value::Null), v);
37 }
38 }
39 (slot, source) => {
40 *slot = source;
41 }
42 }
43}
44
45#[cfg(test)]
46mod tests {
47 use super::__merge_json;
48 use serde_json::json;
49
50 #[test]
51 fn merge_objects_keys_union() {
52 let mut t = json!({"a": 1, "b": 2});
53 __merge_json(&mut t, json!({"b": 20, "c": 3}));
54 assert_eq!(t, json!({"a": 1, "b": 20, "c": 3}));
55 }
56
57 #[test]
58 fn merge_nested_objects() {
59 let mut t = json!({"x": {"a": 1, "b": 2}});
60 __merge_json(&mut t, json!({"x": {"b": 20, "c": 3}}));
61 assert_eq!(t, json!({"x": {"a": 1, "b": 20, "c": 3}}));
62 }
63
64 #[test]
65 fn merge_arrays_replace() {
66 let mut t = json!([1, 2, 3]);
67 __merge_json(&mut t, json!([9]));
68 assert_eq!(t, json!([9]));
69 }
70
71 #[test]
72 fn merge_scalar_replace() {
73 let mut t = json!(1);
74 __merge_json(&mut t, json!("hello"));
75 assert_eq!(t, json!("hello"));
76 }
77}