num_bigint/bigint/
serde.rs

1#![cfg(feature = "serde")]
2#![cfg_attr(docsrs, doc(cfg(feature = "serde")))]
3
4use super::{BigInt, Sign};
5
6use serde::de::{Error, Unexpected};
7use serde::{Deserialize, Deserializer, Serialize, Serializer};
8
9impl Serialize for Sign {
10    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11    where
12        S: Serializer,
13    {
14        // Note: do not change the serialization format, or it may break
15        // forward and backward compatibility of serialized data!
16        match *self {
17            Sign::Minus => (-1i8).serialize(serializer),
18            Sign::NoSign => 0i8.serialize(serializer),
19            Sign::Plus => 1i8.serialize(serializer),
20        }
21    }
22}
23
24impl<'de> Deserialize<'de> for Sign {
25    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26    where
27        D: Deserializer<'de>,
28    {
29        let sign = i8::deserialize(deserializer)?;
30        match sign {
31            -1 => Ok(Sign::Minus),
32            0 => Ok(Sign::NoSign),
33            1 => Ok(Sign::Plus),
34            _ => Err(D::Error::invalid_value(
35                Unexpected::Signed(sign.into()),
36                &"a sign of -1, 0, or 1",
37            )),
38        }
39    }
40}
41
42impl Serialize for BigInt {
43    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
44    where
45        S: Serializer,
46    {
47        // Note: do not change the serialization format, or it may break
48        // forward and backward compatibility of serialized data!
49        (self.sign, &self.data).serialize(serializer)
50    }
51}
52
53impl<'de> Deserialize<'de> for BigInt {
54    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
55    where
56        D: Deserializer<'de>,
57    {
58        let (sign, data) = Deserialize::deserialize(deserializer)?;
59        Ok(BigInt::from_biguint(sign, data))
60    }
61}