Skip to main content

deser_core/ext/bridges/
bigdecimal.rs

1use ::bigdecimal::BigDecimal;
2
3use crate::error::Error;
4use crate::ext::Decimal;
5use crate::ext::known::{Bridge, impl_bridge, out_of_range};
6
7super::num_bigint_conversions!(::bigdecimal::num_bigint);
8
9impl Bridge for BigDecimal {
10    type Known = Decimal;
11
12    fn to_known(&self) -> Result<Decimal, Error> {
13        let (mantissa, scale) = self.as_bigint_and_exponent();
14        let exponent = scale
15            .checked_neg()
16            .ok_or_else(|| out_of_range("decimal out of range"))?;
17        Ok(Decimal::from_parts(&from_num(&mantissa), exponent))
18    }
19
20    fn from_known(value: Decimal) -> Result<BigDecimal, Error> {
21        let (mantissa, exponent) = value.to_parts();
22        let scale = exponent
23            .checked_neg()
24            .ok_or_else(|| out_of_range("decimal out of range"))?;
25        Ok(BigDecimal::new(to_num(&mantissa), scale))
26    }
27}
28
29impl_bridge!(BigDecimal);