serde_fressian/value/
de.rs1#![allow(non_camel_case_types, non_snake_case)]
2
3use std::collections::{BTreeMap};
4use std::fmt;
5
6use serde::de::{ self, Deserialize, SeqAccess, Visitor};
7
8use ordered_float::OrderedFloat;
9use serde_bytes::ByteBuf;
10
11use imp::codes;
13use value::Value;
14use inst::{INST};
15use uuid::{UUID};
16use uri::{URI};
17use regex::{REGEX};
18use sym::{SYM};
19use key::KEY;
20use typed_arrays::*;
21use set::{SET};
22
23macro_rules! impl_seed {
24 ($variant:ident : $T:ident) => {
25
26 struct $variant;
27
28 impl<'de> de::DeserializeSeed<'de> for $variant {
29 type Value = $T;
30
31 fn deserialize<D>(self, deserializer: D) -> Result<$T, D::Error>
32 where D: serde::Deserializer<'de>
33 {
34 $T::deserialize(deserializer)
35 }
36 }
37 }
38}
39
40impl_seed!(BYTES_SEED: ByteBuf);
41impl_seed!(SYM_SEED: SYM);
42impl_seed!(KEY_SEED: KEY);
43impl_seed!(INST_SEED: INST);
44impl_seed!(REGEX_SEED: REGEX);
45impl_seed!(UUID_SEED: UUID);
46impl_seed!(URI_SEED: URI);
47impl_seed!(INT_ARRAY_SEED: IntArray);
48impl_seed!(LONG_ARRAY_SEED: LongArray);
49impl_seed!(FLOAT_ARRAY_SEED: FloatArray);
50impl_seed!(DOUBLE_ARRAY_SEED: DoubleArray);
51impl_seed!(BOOLEAN_ARRAY_SEED: BooleanArray);
52
53
54impl<'de> Deserialize<'de> for Value {
55 #[inline]
56 fn deserialize<D>(deserializer: D) -> Result<Value, D::Error>
57 where D: serde::Deserializer<'de>
58 {
59 struct ValueVisitor;
60
61 impl<'de> de::DeserializeSeed<'de> for ValueVisitor {
62 type Value = i8;
63
64 fn deserialize<D>(self, deserializer: D) -> Result<i8, D::Error>
65 where D: serde::Deserializer<'de>
66 {
67 struct CodeVisitor;
68
69 impl<'de> Visitor<'de> for CodeVisitor {
70 type Value = i8;
71
72 #[inline]
73 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
74 formatter.write_str("code as i8")
75 }
76
77 fn visit_i8<E>(self, value: i8) -> Result<i8, E> {
78 Ok(value)
79 }
80 }
81
82 deserializer.deserialize_tuple_struct("CODE", 1, CodeVisitor)
83 }
84 }
85
86 impl<'de> Visitor<'de> for ValueVisitor {
87 type Value = Value;
88
89 #[inline]
90 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
91 formatter.write_str("any valid fressian value")
92 }
93
94 #[inline]
95 fn visit_seq<V>(self, mut seq: V) -> Result<Value, V::Error>
96 where
97 V: SeqAccess<'de>,
98 {
99 let code: Option<i8> = seq.next_element_seed(self)?;
100
101 if let Some(code) = code {
102 match code as u8 {
103 codes::NULL => {
104 let _: Option<()> = seq.next_element()?;
105 Ok(Value::NULL)
106 },
107 codes::TRUE | codes::FALSE => {
108 let B: Option<bool> = seq.next_element()?;
109 match B {
110 Some(b) => Ok(Value::BOOL(b)),
111 None => Err(de::Error::custom("expected BOOL"))
112 }
113 },
114 0xFF | 0x00..=0x7f | codes::INT => {
115 let val: Option<i64> = seq.next_element()?;
116 match val {
117 Some(i) => {
118 Ok(Value::INT(i))
119 },
120 None => Err(de::Error::custom("expected INT"))
121 }
122 }
123 codes::FLOAT => {
124 let val: Option<f32> = seq.next_element()?;
125 match val {
126 Some(f) => {
127 Ok(Value::FLOAT(OrderedFloat::from(f)))
128 },
129 None => Err(de::Error::custom("missing float"))
130 }
131 }
132 codes::DOUBLE => {
133 let val: Option<f64> = seq.next_element()?;
134 match val {
135 Some(f) => {
136 Ok(Value::DOUBLE(OrderedFloat::from(f)))
137 },
138 None => Err(de::Error::custom("missing double"))
139 }
140 }
141 codes::UTF8
142 |codes::STRING_PACKED_LENGTH_START..=codes::STRING_PACKED_LENGTH_END
143 | codes::STRING => {
144 let val: Option<String> = seq.next_element()?;
145 match val {
146 Some(s) => {
147 Ok(Value::STRING(s))
148 },
149 None => Err(de::Error::custom("missing double"))
150 }
151 }
152 codes::BYTES_PACKED_LENGTH_START..=0xD8
153 | codes::BYTES => {
154 let val: Option<ByteBuf> = seq.next_element_seed(BYTES_SEED)?;
155 match val {
156 Some(bb) => {
157 Ok(Value::BYTES(bb))
158 },
159 None => Err(de::Error::custom("missing BYTES"))
160 }
161 }
162 codes::LIST_PACKED_LENGTH_START..=235
163 | codes::LIST
164 | codes::BEGIN_OPEN_LIST => {
165 let val: Option<Vec<Value>> = seq.next_element()?;
166 match val {
167 Some(v) => {
168 Ok(Value::LIST(v))
169 },
170 None => Err(de::Error::custom("missing LIST"))
171 }
172 }
173 codes::SET => {
174 let val: Option<SET<Value>> = seq.next_element()?;
175 match val {
176 Some(v) => {
177 Ok(Value::SET(v))
178 },
179 None => Err(de::Error::custom("missing map"))
180 }
181 }
182 codes::MAP => {
183 let val: Option<BTreeMap<Value,Value>> = seq.next_element()?;
184 match val {
185 Some(m) => {
186 Ok(Value::MAP(m))
187 },
188 None => Err(de::Error::custom("missing map"))
189 }
190 }
191 codes::KEY => {
192 let val: Option<KEY> = seq.next_element_seed(KEY_SEED)?;
193 match val {
194 Some(key) => {
195 Ok(Value::KEY(key))
196 },
197 None => Err(de::Error::custom("missing KEY"))
198 }
199 }
200 codes::SYM => {
201 let val: Option<SYM> = seq.next_element_seed(SYM_SEED)?;
202 match val {
203 Some(sym) => {
204 Ok(Value::SYM(sym))
205 },
206 None => Err(de::Error::custom("missing SYM"))
207 }
208 }
209 codes::INST => {
210 let val: Option<INST> = seq.next_element_seed(INST_SEED)?;
211 match val {
212 Some(inst) => {
213 Ok(Value::INST(inst))
214 },
215 None => Err(de::Error::custom("missing INST"))
216 }
217 }
218 codes::REGEX => {
219 let val: Option<REGEX> = seq.next_element_seed(REGEX_SEED)?;
220 match val {
221 Some(regex) => {
222 Ok(Value::REGEX(regex))
223 },
224 None => Err(de::Error::custom("missing REGEX"))
225 }
226 }
227 codes::UUID => {
228 let val: Option<UUID> = seq.next_element_seed(UUID_SEED)?;
229 match val {
230 Some(u) => {
231 Ok(Value::UUID(u))
232 },
233 None => Err(de::Error::custom("missing UUID"))
234 }
235 }
236 codes::URI => {
237 let val: Option<URI> = seq.next_element_seed(URI_SEED)?;
238 match val {
239 Some(u) => {
240 Ok(Value::URI(u))
241 },
242 None => Err(de::Error::custom("missing URI"))
243 }
244 }
245 codes::INT_ARRAY => {
246 let val: Option<IntArray> = seq.next_element_seed(INT_ARRAY_SEED)?;
247 match val {
248 Some(v) => {
249 Ok(Value::from(v))
250 },
251 None => Err(de::Error::custom("missing INT_ARRAY"))
252 }
253 }
254 codes::LONG_ARRAY => {
255 let val: Option<LongArray> = seq.next_element_seed(LONG_ARRAY_SEED)?;
256 match val {
257 Some(v) => {
258 Ok(Value::from(v))
259 },
260 None => Err(de::Error::custom("missing LONG_ARRAY"))
261 }
262 }
263 codes::FLOAT_ARRAY => {
264 let val: Option<FloatArray> = seq.next_element_seed(FLOAT_ARRAY_SEED)?;
265 match val {
266 Some(v) => {
267 Ok(Value::from(v))
268 },
269 None => Err(de::Error::custom("missing FLOAT_ARRAY"))
270 }
271 }
272 codes::DOUBLE_ARRAY => {
273 let val: Option<DoubleArray> = seq.next_element_seed(DOUBLE_ARRAY_SEED)?;
274 match val {
275 Some(v) => {
276 Ok(Value::from(v))
277 },
278 None => Err(de::Error::custom("missing DOUBLE_ARRAY"))
279 }
280 }
281 codes::BOOLEAN_ARRAY => {
282 let val: Option<BooleanArray> = seq.next_element_seed(BOOLEAN_ARRAY_SEED)?;
283 match val {
284 Some(v) => {
285 Ok(Value::from(v))
286 },
287 None => Err(de::Error::custom("missing BOOLEAN_ARRAY"))
288 }
289 }
290 _ => Err(de::Error::custom(format!("Value UnmatchedCode:: {}", code as u8)))
291 }
292 } else {
293 Err(de::Error::custom("code == None"))
294 }
295 }
296 }
297 deserializer.deserialize_tuple(2, ValueVisitor)
298 }
299}
300