1pub 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#[derive(PartialEq, Debug)]
17pub enum Value {
18 Null,
20 Boolean(bool),
22 Integer(i32),
24 Long(i64),
26 BigInteger(BigInteger),
28 Float(f32),
30 Double(f64),
32 BigDecimal(BigDecimal),
34 String(String),
36 Binary(Vec<u8>),
38 Array(Vec<Value>),
40 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 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}