deser_core/ext/bridges/
bigdecimal.rs1use ::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);