Skip to main content

junobuild_utils/with/
uint8array_opt.rs

1use crate::serializers::types::JsonDataUint8Array;
2use serde::{Deserialize, Deserializer, Serialize, Serializer};
3
4pub fn serialize<S>(value: &Option<Vec<u8>>, s: S) -> Result<S::Ok, S::Error>
5where
6    S: Serializer,
7{
8    match value {
9        Some(v) => JsonDataUint8Array {
10            value: v.to_owned(),
11        }
12        .serialize(s),
13        None => s.serialize_none(),
14    }
15}
16
17pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Vec<u8>>, D::Error>
18where
19    D: Deserializer<'de>,
20{
21    Option::<JsonDataUint8Array>::deserialize(deserializer).map(|opt| opt.map(|d| d.value))
22}
23
24#[cfg(test)]
25mod tests {
26    use serde::{Deserialize, Serialize};
27    use serde_json;
28
29    #[derive(Serialize, Deserialize, PartialEq, Debug)]
30    struct TestStruct {
31        #[serde(with = "super")]
32        value: Option<Vec<u8>>,
33    }
34
35    #[test]
36    fn serialize_some() {
37        let s = TestStruct {
38            value: Some(vec![1, 2, 3]),
39        };
40        let json = serde_json::to_string(&s).expect("serialize");
41        assert_eq!(json, r#"{"value":{"__uint8array__":[1,2,3]}}"#);
42    }
43
44    #[test]
45    fn serialize_none() {
46        let s = TestStruct { value: None };
47        let json = serde_json::to_string(&s).expect("serialize");
48        assert_eq!(json, r#"{"value":null}"#);
49    }
50
51    #[test]
52    fn deserialize_some() {
53        let json = r#"{"value":{"__uint8array__":[1,2,3]}}"#;
54        let s: TestStruct = serde_json::from_str(json).expect("deserialize");
55        assert_eq!(s.value, Some(vec![1, 2, 3]));
56    }
57
58    #[test]
59    fn deserialize_none() {
60        let json = r#"{"value":null}"#;
61        let s: TestStruct = serde_json::from_str(json).expect("deserialize");
62        assert_eq!(s.value, None);
63    }
64
65    #[test]
66    fn round_trip_some() {
67        let original = TestStruct {
68            value: Some(vec![0, 1, 2, 3, 255]),
69        };
70        let json = serde_json::to_string(&original).unwrap();
71        let decoded: TestStruct = serde_json::from_str(&json).unwrap();
72        assert_eq!(decoded.value, original.value);
73    }
74
75    #[test]
76    fn round_trip_none() {
77        let original = TestStruct { value: None };
78        let json = serde_json::to_string(&original).unwrap();
79        let decoded: TestStruct = serde_json::from_str(&json).unwrap();
80        assert_eq!(decoded.value, original.value);
81    }
82}