use serde::de::Error as _;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[cfg(feature = "fastnum")]
pub mod fastnum_decimal_25 {
use super::*;
use fastnum::decimal::D256;
use fastnum::{bint::UInt, dec256};
const FIXED_EXPONENT: i16 = 25;
pub fn deserialize<'de, D>(deserializer: D) -> Result<D256, D::Error>
where
D: Deserializer<'de>,
{
let bytes: [u8; 32] = Deserialize::deserialize(deserializer)?;
let mut uint = UInt::from_radix_le(&bytes, 256)
.ok_or(D::Error::custom("failed to deserialize uint from bytes"))?;
uint /= UInt::from_u16(10u16).pow((FIXED_EXPONENT as u16).into());
let value = D256::from_parts(
UInt::from_le(uint),
-FIXED_EXPONENT as i32,
fastnum::decimal::Sign::Plus,
fastnum::decimal::Context::default(),
);
Ok(value)
}
pub fn serialize<S: Serializer>(value: &D256, serializer: S) -> Result<S::Ok, S::Error> {
let mut value = value.rescale(FIXED_EXPONENT);
value *= dec256!(10).pow(FIXED_EXPONENT.into());
let mut digits_le: Vec<u8> = value.digits().to_radix_le(256);
let padding_bytes = vec![0; 32 - digits_le.len()];
digits_le.extend(padding_bytes);
let exact_bytes: [u8; 32] = digits_le.try_into().unwrap();
exact_bytes.serialize(serializer)
}
}
pub mod map {
use std::collections::HashMap;
use super::*;
pub fn serialize<S: Serializer>(
value: &HashMap<String, String>,
serializer: S,
) -> Result<S::Ok, S::Error> {
let value: Vec<(String, String)> = value.clone().into_iter().collect();
value.serialize(serializer)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<HashMap<String, String>, D::Error>
where
D: Deserializer<'de>,
{
let value: Vec<(String, String)> = Deserialize::deserialize(deserializer)?;
Ok(value.into_iter().collect())
}
}