junobuild_utils/with/
uint8array_opt.rs1use 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}