zen-types 2.1.0

Zen Core Types
Documentation
use rust_decimal::Decimal;
use serde::Serializer;

#[cfg(feature = "arbitrary_precision")]
use crate::constant::NUMBER_TOKEN;
#[cfg(not(feature = "arbitrary_precision"))]
use rust_decimal::prelude::ToPrimitive;
#[cfg(feature = "arbitrary_precision")]
use serde::ser::SerializeStruct;

pub(crate) struct NumberSer;

impl NumberSer {
    #[cfg(feature = "arbitrary_precision")]
    pub(crate) fn serialize<S: Serializer>(
        value: &Decimal,
        serializer: S,
    ) -> Result<S::Ok, S::Error> {
        let mut s = serializer.serialize_struct(NUMBER_TOKEN, 1)?;
        s.serialize_field(NUMBER_TOKEN, &value.normalize().to_string())?;
        s.end()
    }

    #[cfg(not(feature = "arbitrary_precision"))]
    pub(crate) fn serialize<S: Serializer>(
        value: &Decimal,
        serializer: S,
    ) -> Result<S::Ok, S::Error> {
        if value.is_integer() {
            if let Some(u) = value.to_u64() {
                return serializer.serialize_u64(u);
            }
            if let Some(i) = value.to_i64() {
                return serializer.serialize_i64(i);
            }
        }
        match value.to_f64() {
            Some(f) => serializer.serialize_f64(f),
            None => Err(serde::ser::Error::custom("cannot convert to f64")),
        }
    }
}