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