injective_math/fp_decimal/
serde.rs

1use crate::fp_decimal::FPDecimal;
2use serde::{de, ser, Deserialize, Deserializer, Serialize};
3use std::fmt;
4use std::str::FromStr;
5
6#[allow(clippy::upper_case_acronyms)]
7struct FPDecimalVisitor;
8
9impl<'de> de::Visitor<'de> for FPDecimalVisitor {
10    type Value = FPDecimal;
11
12    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
13        formatter.write_str("FPDecimal (string-encoded)")
14    }
15
16    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
17    where
18        E: de::Error,
19    {
20        match FPDecimal::from_str(v) {
21            Ok(d) => Ok(d),
22            Err(e) => Err(E::custom(format!("Error parsing FPDecimal '{v}': {e}"))),
23        }
24    }
25}
26
27/// Serializes as a decimal string
28impl Serialize for FPDecimal {
29    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30    where
31        S: ser::Serializer,
32    {
33        serializer.serialize_str(&format!("{}", &self))
34    }
35}
36
37/// Deserializes as a base64 string
38impl<'de> Deserialize<'de> for FPDecimal {
39    fn deserialize<D>(deserializer: D) -> Result<FPDecimal, D::Error>
40    where
41        D: Deserializer<'de>,
42    {
43        deserializer.deserialize_str(FPDecimalVisitor)
44    }
45}