num_bigint/bigint/
serde.rs1#![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 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 (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}