Skip to main content

deser_core/ext/bridges/
rust_decimal.rs

1use crate::error::Error;
2use crate::ext::Decimal;
3use crate::ext::known::{Bridge, impl_bridge, invalid};
4use alloc::format;
5use alloc::string::ToString;
6
7impl Bridge for ::rust_decimal::Decimal {
8    type Known = Decimal;
9
10    fn to_known(&self) -> Result<Decimal, Error> {
11        Decimal::new(self.to_string())
12    }
13
14    /// Converts a decimal, fails if it cannot be represented exactly.
15    fn from_known(value: Decimal) -> Result<::rust_decimal::Decimal, Error> {
16        let s = value.as_str();
17        let rv = if s.contains(['e', 'E']) {
18            ::rust_decimal::Decimal::from_scientific(s)
19        } else {
20            ::rust_decimal::Decimal::from_str_exact(s)
21        };
22        rv.map_err(|err| invalid(format!("cannot represent decimal: {}", err)))
23    }
24}
25
26impl_bridge!(::rust_decimal::Decimal);