k8_diff/json/
se.rs

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}