Skip to main content

junobuild_utils/with/
bigint_opt.rs

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