serde_smile/value/
mod.rs

1//! Definition of a Smile value.
2
3pub use crate::value::big_decimal::BigDecimal;
4use crate::value::big_decimal::BigDecimalVisitor;
5pub use crate::value::big_integer::BigInteger;
6use crate::value::big_integer::BigIntegerVisitor;
7use indexmap::IndexMap;
8use serde::de::{self, DeserializeSeed, MapAccess, SeqAccess, Visitor};
9use serde::{Deserialize, Deserializer, Serialize, Serializer};
10use std::fmt;
11
12mod big_decimal;
13mod big_integer;
14
15/// A representation of a Smile value.
16#[derive(PartialEq, Debug)]
17pub enum Value {
18    /// A null value.
19    Null,
20    /// A boolean value.
21    Boolean(bool),
22    /// An integer value.
23    Integer(i32),
24    /// A long value.
25    Long(i64),
26    /// A big integer value.
27    BigInteger(BigInteger),
28    /// A float value.
29    Float(f32),
30    /// A double value.
31    Double(f64),
32    /// A big decimal value.
33    BigDecimal(BigDecimal),
34    /// A string value.
35    String(String),
36    /// A binary value.
37    Binary(Vec<u8>),
38    /// An array value.
39    Array(Vec<Value>),
40    /// An object value.
41    Object(IndexMap<String, Value>),
42}
43
44impl Serialize for Value {
45    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
46    where
47        S: Serializer,
48    {
49        match self {
50            Value::Null => serializer.serialize_unit(),
51            Value::Boolean(v) => serializer.serialize_bool(*v),
52            Value::Integer(v) => serializer.serialize_i32(*v),
53            Value::Long(v) => serializer.serialize_i64(*v),
54            Value::BigInteger(v) => v.serialize(serializer),
55            Value::Float(v) => serializer.serialize_f32(*v),
56            Value::Double(v) => serializer.serialize_f64(*v),
57            Value::BigDecimal(v) => v.serialize(serializer),
58            Value::String(v) => serializer.serialize_str(v),
59            Value::Binary(v) => serializer.serialize_bytes(v),
60            Value::Array(v) => v.serialize(serializer),
61            Value::Object(v) => v.serialize(serializer),
62        }
63    }
64}
65
66impl<'de> Deserialize<'de> for Value {
67    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
68    where
69        D: Deserializer<'de>,
70    {
71        // We want to avoid the normal coercion of BigInteger values to normal Rust integers. Rather than adding another
72        // special case in the deserialize for Value, we instead just hint that we are trying to deserialize a
73        // BigInteger. The Deserializer logic will deserialize BigIntegers without conversion but still handle other
74        // values normally.
75        deserializer.deserialize_struct(
76            BigInteger::STRUCT_NAME,
77            &[BigInteger::FIELD_NAME],
78            ValueVisitor,
79        )
80    }
81}
82
83struct ValueVisitor;
84
85impl<'de> Visitor<'de> for ValueVisitor {
86    type Value = Value;
87
88    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
89        formatter.write_str("any Smile value")
90    }
91
92    fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
93    where
94        E: de::Error,
95    {
96        Ok(Value::Boolean(v))
97    }
98
99    fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
100    where
101        E: de::Error,
102    {
103        Ok(Value::Integer(v))
104    }
105
106    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
107    where
108        E: de::Error,
109    {
110        Ok(Value::Long(v))
111    }
112
113    fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
114    where
115        E: de::Error,
116    {
117        Ok(Value::Float(v))
118    }
119
120    fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
121    where
122        E: de::Error,
123    {
124        Ok(Value::Double(v))
125    }
126
127    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
128    where
129        E: de::Error,
130    {
131        Ok(Value::String(v.to_string()))
132    }
133
134    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
135    where
136        E: de::Error,
137    {
138        Ok(Value::String(v))
139    }
140
141    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
142    where
143        E: de::Error,
144    {
145        Ok(Value::Binary(v.to_vec()))
146    }
147
148    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
149    where
150        E: de::Error,
151    {
152        Ok(Value::Binary(v))
153    }
154
155    fn visit_unit<E>(self) -> Result<Self::Value, E>
156    where
157        E: de::Error,
158    {
159        Ok(Value::Null)
160    }
161
162    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
163    where
164        A: SeqAccess<'de>,
165    {
166        let mut vec = vec![];
167        while let Some(value) = seq.next_element()? {
168            vec.push(value);
169        }
170        Ok(Value::Array(vec))
171    }
172
173    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
174    where
175        A: MapAccess<'de>,
176    {
177        let mut v = IndexMap::new();
178
179        let mut key = String::new();
180        match map.next_key_seed(FirstKeySeed { key: &mut key })? {
181            Some(FirstKey::BigInteger) => {
182                return BigIntegerVisitor.finish_map(map).map(Value::BigInteger)
183            }
184            Some(FirstKey::BigDecimal) => {
185                return BigDecimalVisitor.finish_map(map).map(Value::BigDecimal)
186            }
187            Some(FirstKey::Other) => {}
188            None => return Ok(Value::Object(v)),
189        }
190
191        v.insert(key, map.next_value()?);
192        while let Some((key, value)) = map.next_entry()? {
193            v.insert(key, value);
194        }
195
196        Ok(Value::Object(v))
197    }
198}
199
200enum FirstKey {
201    BigInteger,
202    BigDecimal,
203    Other,
204}
205
206struct FirstKeySeed<'a> {
207    key: &'a mut String,
208}
209
210impl<'de> DeserializeSeed<'de> for FirstKeySeed<'_> {
211    type Value = FirstKey;
212
213    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
214    where
215        D: Deserializer<'de>,
216    {
217        deserializer.deserialize_str(self)
218    }
219}
220
221impl<'de> Visitor<'de> for FirstKeySeed<'_> {
222    type Value = FirstKey;
223
224    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
225        formatter.write_str("a string")
226    }
227
228    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
229    where
230        E: de::Error,
231    {
232        match v {
233            BigInteger::FIELD_NAME => Ok(FirstKey::BigInteger),
234            BigDecimal::SCALE_FIELD_NAME => Ok(FirstKey::BigDecimal),
235            _ => {
236                self.key.push_str(v);
237                Ok(FirstKey::Other)
238            }
239        }
240    }
241
242    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
243    where
244        E: de::Error,
245    {
246        match &*v {
247            BigInteger::FIELD_NAME => Ok(FirstKey::BigInteger),
248            BigDecimal::SCALE_FIELD_NAME => Ok(FirstKey::BigDecimal),
249            _ => {
250                *self.key = v;
251                Ok(FirstKey::Other)
252            }
253        }
254    }
255}