1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use Decimal;
use num::{FromPrimitive, Zero};
use serde;
use std::fmt;
use std::str::FromStr;

impl<'de> serde::Deserialize<'de> for Decimal {
    fn deserialize<D>(deserializer: D) -> Result<Decimal, D::Error>
    where
        D: serde::de::Deserializer<'de>, {
        deserializer.deserialize_any(DecimalVisitor)
    }
}

struct DecimalVisitor;

impl<'de> serde::de::Visitor<'de> for DecimalVisitor {
    type Value = Decimal;

    fn visit_i16<E>(self, value: i16) -> Result<Decimal, E> {
        match Decimal::from_i32(value as i32) {
            Some(s) => Ok(s),
            None => Ok(Decimal::zero()),
        }
    }

    fn visit_i32<E>(self, value: i32) -> Result<Decimal, E> {
        match Decimal::from_i32(value) {
            Some(s) => Ok(s),
            None => Ok(Decimal::zero()),
        }
    }

    fn visit_str<E>(self, value: &str) -> Result<Decimal, E> {
        match Decimal::from_str(value) {
            Ok(s) => Ok(s),
            Err(_) => Ok(Decimal::zero()),
        }
    }

    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        write!(
            formatter,
            "a Decimal type representing a fixed-point number"
        )
    }
}

impl serde::Serialize for Decimal {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer, {
        serializer.serialize_str(&self.to_string())
    }
}