dlhn/format/
big_int.rs

1use crate::de::Error;
2use num_bigint::BigInt;
3use num_traits::Zero;
4use serde::{
5    de::{self, SeqAccess, Unexpected, Visitor},
6    ser::SerializeSeq,
7    Deserializer, Serializer,
8};
9
10struct BigIntVisitor;
11
12impl<'de> Visitor<'de> for BigIntVisitor {
13    type Value = BigInt;
14
15    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
16        formatter.write_str("format error")
17    }
18
19    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
20    where
21        A: SeqAccess<'de>,
22    {
23        let v = seq
24            .next_element::<Vec<u8>>()?
25            .ok_or(de::Error::invalid_value(Unexpected::Seq, &Error::Read))?;
26        Ok(BigInt::from_signed_bytes_le(v.as_slice()))
27    }
28}
29
30pub fn serialize<T: Serializer>(big_int: &BigInt, serializer: T) -> Result<T::Ok, T::Error> {
31    let mut seq = serializer.serialize_seq(None)?;
32
33    if big_int.is_zero() {
34        seq.serialize_element(&0u8)?;
35    } else {
36        seq.serialize_element(&big_int.to_signed_bytes_le())?;
37    }
38
39    seq.end()
40}
41
42pub fn deserialize<'de, T: Deserializer<'de>>(deserializer: T) -> Result<BigInt, T::Error> {
43    deserializer.deserialize_tuple(1, BigIntVisitor)
44}
45
46#[cfg(test)]
47mod tests {
48    use crate::{de::Deserializer, ser::Serializer};
49    use num_bigint::BigInt;
50
51    #[test]
52    fn serilize() {
53        assert_eq!(encode_big_int(BigInt::from(0)), [0]);
54        assert_eq!(
55            encode_big_int(BigInt::from(i8::MIN)),
56            [[1], i8::MIN.to_le_bytes()].concat()
57        );
58        assert_eq!(
59            encode_big_int(BigInt::from(i8::MAX)),
60            [[1], i8::MAX.to_le_bytes()].concat()
61        );
62        assert_eq!(
63            encode_big_int(BigInt::from(i16::MIN)),
64            [[2].as_ref(), i16::MIN.to_le_bytes().as_ref()].concat()
65        );
66        assert_eq!(
67            encode_big_int(BigInt::from(i16::MAX)),
68            [[2].as_ref(), i16::MAX.to_le_bytes().as_ref()].concat()
69        );
70        assert_eq!(
71            encode_big_int(BigInt::from(i16::MIN) - 1),
72            [3, 255, 127, 255]
73        );
74        assert_eq!(encode_big_int(BigInt::from(i16::MAX) + 1), [3, 0, 128, 0]);
75        assert_eq!(
76            encode_big_int(BigInt::from(i32::MIN)),
77            [[4].as_ref(), i32::MIN.to_le_bytes().as_ref()].concat()
78        );
79        assert_eq!(
80            encode_big_int(BigInt::from(i32::MAX)),
81            [[4].as_ref(), i32::MAX.to_le_bytes().as_ref()].concat()
82        );
83        assert_eq!(
84            encode_big_int(BigInt::from(i32::MIN) - 1),
85            [5, 255, 255, 255, 127, 255]
86        );
87        assert_eq!(
88            encode_big_int(BigInt::from(i32::MAX) + 1),
89            [5, 0, 0, 0, 128, 0]
90        );
91        assert_eq!(
92            encode_big_int(BigInt::from(i64::MIN)),
93            [[8].as_ref(), i64::MIN.to_le_bytes().as_ref()].concat()
94        );
95        assert_eq!(
96            encode_big_int(BigInt::from(i64::MAX)),
97            [[8].as_ref(), i64::MAX.to_le_bytes().as_ref()].concat()
98        );
99        assert_eq!(
100            encode_big_int(BigInt::from(i64::MIN) - 1),
101            [9, 255, 255, 255, 255, 255, 255, 255, 127, 255]
102        );
103        assert_eq!(
104            encode_big_int(BigInt::from(i64::MAX) + 1),
105            [9, 0, 0, 0, 0, 0, 0, 0, 128, 0]
106        );
107        assert_eq!(
108            encode_big_int(BigInt::from(i128::MIN)),
109            [[16].as_ref(), i128::MIN.to_le_bytes().as_ref()].concat()
110        );
111        assert_eq!(
112            encode_big_int(BigInt::from(i128::MAX)),
113            [[16].as_ref(), i128::MAX.to_le_bytes().as_ref()].concat()
114        );
115        assert_eq!(
116            encode_big_int(BigInt::from(i128::MIN) - 1),
117            [
118                17, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,
119                255
120            ]
121        );
122        assert_eq!(
123            encode_big_int(BigInt::from(i128::MAX) + 1),
124            [17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0]
125        );
126    }
127
128    #[test]
129    fn deserialize() {
130        fn assert_big_int(big_int: BigInt) {
131            let buf = encode_big_int(big_int.clone());
132            let mut reader = buf.as_slice();
133            let mut deserializer = Deserializer::new(&mut reader);
134            assert_eq!(big_int, super::deserialize(&mut deserializer).unwrap());
135        }
136
137        IntoIterator::into_iter([
138            BigInt::from(0),
139            BigInt::from(i8::MIN),
140            BigInt::from(i8::MAX),
141            BigInt::from(i8::MIN) - 1,
142            BigInt::from(i8::MAX) + 1,
143            BigInt::from(i16::MIN),
144            BigInt::from(i16::MAX),
145            BigInt::from(i16::MIN) - 1,
146            BigInt::from(i16::MAX) + 1,
147            BigInt::from(i32::MIN),
148            BigInt::from(i32::MAX),
149            BigInt::from(i32::MIN) - 1,
150            BigInt::from(i32::MAX) + 1,
151            BigInt::from(i64::MIN),
152            BigInt::from(i64::MAX),
153            BigInt::from(i64::MIN) - 1,
154            BigInt::from(i64::MAX) + 1,
155            BigInt::from(i128::MIN),
156            BigInt::from(i128::MAX),
157            BigInt::from(i128::MIN) - 1,
158            BigInt::from(i128::MAX) + 1,
159        ])
160        .for_each(assert_big_int);
161    }
162
163    fn encode_big_int(big_int: BigInt) -> Vec<u8> {
164        let mut buf = Vec::new();
165        let mut serializer = Serializer::new(&mut buf);
166        super::serialize(&big_int, &mut serializer).unwrap();
167        buf
168    }
169}