blob: 5c232f94347930ca16e7b652e9fa4496325e3e99 [file] [log] [blame]
use super::{BigInt, Sign};
use serde::de::{Error, Unexpected};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
impl Serialize for Sign {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
// Note: do not change the serialization format, or it may break
// forward and backward compatibility of serialized data!
match *self {
Sign::Minus => (-1i8).serialize(serializer),
Sign::NoSign => 0i8.serialize(serializer),
Sign::Plus => 1i8.serialize(serializer),
}
}
}
impl<'de> Deserialize<'de> for Sign {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let sign = i8::deserialize(deserializer)?;
match sign {
-1 => Ok(Sign::Minus),
0 => Ok(Sign::NoSign),
1 => Ok(Sign::Plus),
_ => Err(D::Error::invalid_value(
Unexpected::Signed(sign.into()),
&"a sign of -1, 0, or 1",
)),
}
}
}
impl Serialize for BigInt {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
// Note: do not change the serialization format, or it may break
// forward and backward compatibility of serialized data!
(self.sign, &self.data).serialize(serializer)
}
}
impl<'de> Deserialize<'de> for BigInt {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let (sign, data) = Deserialize::deserialize(deserializer)?;
Ok(BigInt::from_biguint(sign, data))
}
}