• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![cfg(feature = "serde")]
2 #![cfg_attr(docsrs, doc(cfg(feature = "serde")))]
3 
4 use super::{BigInt, Sign};
5 
6 use serde::de::{Error, Unexpected};
7 use serde::{Deserialize, Deserializer, Serialize, Serializer};
8 
9 impl Serialize for Sign {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,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 
24 impl<'de> Deserialize<'de> for Sign {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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 
42 impl Serialize for BigInt {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,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 
53 impl<'de> Deserialize<'de> for BigInt {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,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 }
62