1use serde::Serialize;
2use serde_json::Value;
3
4use super::PatchObject;
5use crate::Diff;
6
7impl Serialize for PatchObject {
8 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9 where
10 S: ::serde::Serializer,
11 {
12 let diff_maps = self.get_inner_ref();
13 use serde::ser::SerializeMap;
14 let mut map = serializer.serialize_map(Some(diff_maps.len()))?;
15 for (key, val) in diff_maps {
16 match val {
17 Diff::None => {}
18 Diff::Delete => {}
19 Diff::Patch(ref v) => map.serialize_entry(key, v)?,
20 Diff::Replace(ref v) => {
21 map.serialize_entry(key, v)?;
22 }
23 Diff::Merge(ref v) => {
24 map.serialize_entry(key, v)?;
25 }
26 }
27 }
28
29 map.end()
30 }
31}
32
33impl Serialize for Diff<Value, PatchObject> {
34 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
35 where
36 S: ::serde::Serializer,
37 {
38 match self {
39 Diff::None => serializer.serialize_unit(),
40 Diff::Delete => serializer.serialize_unit(),
41 Diff::Patch(ref p) => p.serialize(serializer),
42 Diff::Replace(ref v) => v.serialize(serializer),
43 Diff::Merge(ref v) => v.serialize(serializer),
44 }
45 }
46}
47
48#[cfg(test)]
49mod test {
50
51 use serde_json::json;
52
53 use crate::Changes;
54
55 #[test]
56 fn test_patch_to_simple() {
57 let old_spec = json!({
58 "replicas": 2,
59 "apple": 5
60 });
61 let new_spec = json!({
62 "replicas": 3,
63 "apple": 5
64 });
65
66 let diff = old_spec.diff(&new_spec).expect("diff");
67 assert!(diff.is_patch());
68
69 let expected = json!({
70 "replicas": 3
71 });
72 let json_diff = serde_json::to_value(diff).unwrap();
73 assert_eq!(json_diff, expected);
74 }
75
76 #[test]
77 fn test_patch_to_hierarchy() {
78 let old_spec = json!({
79 "spec": {
80 "replicas": 2,
81 "apple": 5
82 }
83 });
84 let new_spec = json!({
85 "spec": {
86 "replicas": 3,
87 "apple": 5
88 }
89 });
90
91 let diff = old_spec.diff(&new_spec).expect("diff");
92 assert!(diff.is_patch());
93 println!("final diff: {:#?}", diff);
94 let expected = json!({
95 "spec": {
96 "replicas": 3
97 }});
98 let json_diff = serde_json::to_value(diff).unwrap();
99 assert_eq!(json_diff, expected);
100 }
101}