#[cfg(feature = "serde-arbitrary-precision")]
mod details;
#[cfg(feature = "serde-arbitrary-precision")]
type D<const N: usize> = crate::decimal::Decimal<N>;
#[cfg(feature = "serde-arbitrary-precision")]
pub mod arbitrary_precision {
use super::*;
use serde::{de, Serialize};
use std::str::FromStr;
pub fn deserialize<'de, Ds, const N: usize>(deserializer: Ds) -> Result<D<N>, Ds::Error>
where
Ds: de::Deserializer<'de>,
{
deserializer.deserialize_any(details::Visitor)
}
pub fn serialize<S, const N: usize>(value: &D<N>, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serde_json::Number::from_str(&value.to_string())
.map_err(serde::ser::Error::custom)?
.serialize(serializer)
}
}
#[cfg(feature = "serde-arbitrary-precision")]
pub mod arbitrary_precision_option {
use super::*;
use serde::{de, Serialize};
pub fn deserialize<'de, Ds, const N: usize>(deserializer: Ds) -> Result<Option<D<N>>, Ds::Error>
where
Ds: de::Deserializer<'de>,
{
deserializer.deserialize_option(details::OptionVisitor)
}
pub fn serialize<S, const N: usize>(
value: &Option<D<N>>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match value {
Some(decimal) => {
serde_json::Number::from_string_unchecked(decimal.to_string()).serialize(serializer)
}
None => serializer.serialize_none(),
}
}
}