use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::native::BigComplex;
use oxinum_float::native::BigFloat;
#[derive(Serialize, Deserialize)]
struct BigComplexRepr {
re: BigFloat,
im: BigFloat,
}
impl Serialize for BigComplex {
fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
BigComplexRepr {
re: self.re.clone(),
im: self.im.clone(),
}
.serialize(s)
}
}
impl<'de> Deserialize<'de> for BigComplex {
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
BigComplexRepr::deserialize(d).map(|repr| BigComplex::from_parts(repr.re, repr.im))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn json_round_trip() {
let z = BigComplex::from_f64(1.0, 2.0, 64).expect("finite parts");
let json = serde_json::to_string(&z).expect("serialize BigComplex");
let back: BigComplex = serde_json::from_str(&json).expect("deserialize BigComplex");
assert_eq!(back.re().to_f64(), z.re().to_f64());
assert_eq!(back.im().to_f64(), z.im().to_f64());
}
}