Skip to main content

junobuild_utils/with/
bigint.rs

1use crate::serializers::types::JsonDataBigInt;
2use serde::{Deserialize, Deserializer, Serialize, Serializer};
3
4pub fn serialize<S>(value: &u64, s: S) -> Result<S::Ok, S::Error>
5where
6    S: Serializer,
7{
8    JsonDataBigInt { value: *value }.serialize(s)
9}
10
11pub fn deserialize<'de, D>(deserializer: D) -> Result<u64, D::Error>
12where
13    D: Deserializer<'de>,
14{
15    JsonDataBigInt::deserialize(deserializer).map(|d| d.value)
16}
17
18#[cfg(test)]
19mod tests {
20    use serde::{Deserialize, Serialize};
21    use serde_json;
22
23    #[derive(Serialize, Deserialize, PartialEq, Debug)]
24    struct TestStruct {
25        #[serde(with = "crate::with::bigint")]
26        value: u64,
27    }
28
29    #[test]
30    fn serialize_bigint() {
31        let s = TestStruct { value: 42 };
32        let json = serde_json::to_string(&s).expect("serialize");
33        assert_eq!(json, r#"{"value":{"__bigint__":"42"}}"#);
34    }
35
36    #[test]
37    fn deserialize_bigint() {
38        let json = r#"{"value":{"__bigint__":"42"}}"#;
39        let s: TestStruct = serde_json::from_str(json).expect("deserialize");
40        assert_eq!(s.value, 42);
41    }
42
43    #[test]
44    fn round_trip() {
45        let original = TestStruct { value: u64::MAX };
46        let json = serde_json::to_string(&original).unwrap();
47        let decoded: TestStruct = serde_json::from_str(&json).unwrap();
48        assert_eq!(decoded.value, original.value);
49    }
50}