use serde::{Deserialize, Deserializer, Serialize, Serializer};
use oxinum_int::native::{BigInt, BigUint};
use super::rational::BigRational;
#[derive(Serialize, Deserialize)]
struct BigRationalRepr {
num: BigInt,
den: BigUint,
}
impl TryFrom<BigRationalRepr> for BigRational {
type Error = String;
fn try_from(r: BigRationalRepr) -> Result<Self, Self::Error> {
BigRational::from_parts(r.num, r.den).map_err(|e| format!("{e}"))
}
}
impl Serialize for BigRational {
fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
BigRationalRepr {
num: self.num.clone(),
den: self.den.clone(),
}
.serialize(s)
}
}
impl<'de> Deserialize<'de> for BigRational {
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
BigRationalRepr::deserialize(d)
.and_then(|r| BigRational::try_from(r).map_err(serde::de::Error::custom))
}
}