substrate_fixed/
serdeize.rs

1// Copyright © 2018–2019 Trevor Spiteri
2
3// This library is free software: you can redistribute it and/or
4// modify it under the terms of either
5//
6//   * the Apache License, Version 2.0 or
7//   * the MIT License
8//
9// at your option.
10//
11// You should have recieved copies of the Apache License and the MIT
12// License along with the library. If not, see
13// <https://www.apache.org/licenses/LICENSE-2.0> and
14// <https://opensource.org/licenses/MIT>.
15
16use crate::{
17    types::extra::{LeEqU128, LeEqU16, LeEqU32, LeEqU64, LeEqU8},
18    FixedI128, FixedI16, FixedI32, FixedI64, FixedI8, FixedU128, FixedU16, FixedU32, FixedU64,
19    FixedU8, Wrapping,
20};
21use core::fmt::{Formatter, Result as FmtResult};
22use serde::{
23    de::{self, Deserialize, Deserializer, MapAccess, SeqAccess, Visitor},
24    ser::{Serialize, SerializeStruct, Serializer},
25};
26
27macro_rules! serde_fixed {
28    ($Fixed:ident($LeEqU:ident) is $TBits:ident name $Name:expr) => {
29        impl<Frac: $LeEqU> Serialize for $Fixed<Frac> {
30            fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
31                let bits = self.to_bits();
32                let mut state = serializer.serialize_struct($Name, 1)?;
33                state.serialize_field("bits", &bits)?;
34                state.end()
35            }
36        }
37        impl<Frac: $LeEqU> Serialize for Wrapping<$Fixed<Frac>> {
38            fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
39                self.0.serialize(serializer)
40            }
41        }
42
43        impl<'de, Frac: $LeEqU> Deserialize<'de> for $Fixed<Frac> {
44            fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
45                struct FixedVisitor;
46
47                impl<'de> Visitor<'de> for FixedVisitor {
48                    type Value = $TBits;
49
50                    fn expecting(&self, formatter: &mut Formatter) -> FmtResult {
51                        formatter.write_str("struct ")?;
52                        formatter.write_str($Name)
53                    }
54
55                    fn visit_seq<V: SeqAccess<'de>>(self, mut seq: V) -> Result<$TBits, V::Error> {
56                        let bits = seq
57                            .next_element()?
58                            .ok_or_else(|| de::Error::invalid_length(0, &self))?;
59                        Ok(bits)
60                    }
61
62                    fn visit_map<V: MapAccess<'de>>(self, mut map: V) -> Result<$TBits, V::Error> {
63                        let mut bits = None;
64                        while let Some(key) = map.next_key()? {
65                            match key {
66                                Field::Bits => {
67                                    if bits.is_some() {
68                                        return Err(de::Error::duplicate_field("bits"));
69                                    }
70                                    bits = Some(map.next_value()?);
71                                }
72                            }
73                        }
74                        let bits = bits.ok_or_else(|| de::Error::missing_field("bits"))?;
75                        Ok(bits)
76                    }
77                }
78
79                let bits = deserializer.deserialize_struct($Name, FIELDS, FixedVisitor)?;
80                Ok($Fixed::from_bits(bits))
81            }
82        }
83
84        impl<'de, Frac: $LeEqU> Deserialize<'de> for Wrapping<$Fixed<Frac>> {
85            fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
86                $Fixed::deserialize(deserializer).map(Wrapping)
87            }
88        }
89    };
90}
91
92serde_fixed! { FixedI8(LeEqU8) is i8 name "FixedI8" }
93serde_fixed! { FixedI16(LeEqU16) is i16 name "FixedI16" }
94serde_fixed! { FixedI32(LeEqU32) is i32 name "FixedI32" }
95serde_fixed! { FixedI64(LeEqU64) is i64 name "FixedI64" }
96serde_fixed! { FixedI128(LeEqU128) is i128 name "FixedI128" }
97serde_fixed! { FixedU8(LeEqU8) is u8 name "FixedU8" }
98serde_fixed! { FixedU16(LeEqU16) is u16 name "FixedU16" }
99serde_fixed! { FixedU32(LeEqU32) is u32 name "FixedU32" }
100serde_fixed! { FixedU64(LeEqU64) is u64 name "FixedU64" }
101serde_fixed! { FixedU128(LeEqU128) is u128 name "FixedU128" }
102
103const FIELDS: &[&str] = &["bits"];
104
105enum Field {
106    Bits,
107}
108
109impl<'de> Deserialize<'de> for Field {
110    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Field, D::Error> {
111        struct FieldVisitor;
112
113        impl<'de> Visitor<'de> for FieldVisitor {
114            type Value = Field;
115
116            fn expecting(&self, formatter: &mut Formatter) -> FmtResult {
117                formatter.write_str("`bits`")
118            }
119
120            fn visit_str<E: de::Error>(self, value: &str) -> Result<Field, E> {
121                match value {
122                    "bits" => Ok(Field::Bits),
123                    _ => Err(de::Error::unknown_field(value, FIELDS)),
124                }
125            }
126        }
127
128        deserializer.deserialize_identifier(FieldVisitor)
129    }
130}