1 use std::collections::VecDeque;
2 use std::iter::Enumerate;
3 
4 use serde::de;
5 
6 use crate::config::Config;
7 use crate::error::{ConfigError, Result};
8 use crate::map::Map;
9 use crate::value::{Table, Value, ValueKind};
10 
11 impl<'de> de::Deserializer<'de> for Value {
12     type Error = ConfigError;
13 
14     #[inline]
deserialize_any<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,15     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
16     where
17         V: de::Visitor<'de>,
18     {
19         // Deserialize based on the underlying type
20         match self.kind {
21             ValueKind::Nil => visitor.visit_unit(),
22             ValueKind::I64(i) => visitor.visit_i64(i),
23             ValueKind::I128(i) => visitor.visit_i128(i),
24             ValueKind::U64(i) => visitor.visit_u64(i),
25             ValueKind::U128(i) => visitor.visit_u128(i),
26             ValueKind::Boolean(b) => visitor.visit_bool(b),
27             ValueKind::Float(f) => visitor.visit_f64(f),
28             ValueKind::String(s) => visitor.visit_string(s),
29             ValueKind::Array(values) => visitor.visit_seq(SeqAccess::new(values)),
30             ValueKind::Table(map) => visitor.visit_map(MapAccess::new(map)),
31         }
32     }
33 
34     #[inline]
deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>35     fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
36         visitor.visit_bool(self.into_bool()?)
37     }
38 
39     #[inline]
deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>40     fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
41         // FIXME: This should *fail* if the value does not fit in the requets integer type
42         visitor.visit_i8(self.into_int()? as i8)
43     }
44 
45     #[inline]
deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>46     fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
47         // FIXME: This should *fail* if the value does not fit in the requets integer type
48         visitor.visit_i16(self.into_int()? as i16)
49     }
50 
51     #[inline]
deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>52     fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
53         // FIXME: This should *fail* if the value does not fit in the requets integer type
54         visitor.visit_i32(self.into_int()? as i32)
55     }
56 
57     #[inline]
deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>58     fn deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
59         visitor.visit_i64(self.into_int()?)
60     }
61 
62     #[inline]
deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>63     fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
64         // FIXME: This should *fail* if the value does not fit in the requets integer type
65         visitor.visit_u8(self.into_uint()? as u8)
66     }
67 
68     #[inline]
deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>69     fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
70         // FIXME: This should *fail* if the value does not fit in the requets integer type
71         visitor.visit_u16(self.into_uint()? as u16)
72     }
73 
74     #[inline]
deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>75     fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
76         // FIXME: This should *fail* if the value does not fit in the requets integer type
77         visitor.visit_u32(self.into_uint()? as u32)
78     }
79 
80     #[inline]
deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>81     fn deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
82         // FIXME: This should *fail* if the value does not fit in the requets integer type
83         visitor.visit_u64(self.into_uint()? as u64)
84     }
85 
86     #[inline]
deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>87     fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
88         visitor.visit_f32(self.into_float()? as f32)
89     }
90 
91     #[inline]
deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>92     fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
93         visitor.visit_f64(self.into_float()?)
94     }
95 
96     #[inline]
deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>97     fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
98         visitor.visit_string(self.into_string()?)
99     }
100 
101     #[inline]
deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>102     fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
103         visitor.visit_string(self.into_string()?)
104     }
105 
106     #[inline]
deserialize_option<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,107     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
108     where
109         V: de::Visitor<'de>,
110     {
111         // Match an explicit nil as None and everything else as Some
112         match self.kind {
113             ValueKind::Nil => visitor.visit_none(),
114             _ => visitor.visit_some(self),
115         }
116     }
117 
deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,118     fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
119     where
120         V: de::Visitor<'de>,
121     {
122         visitor.visit_newtype_struct(self)
123     }
124 
deserialize_enum<V>( self, name: &'static str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value> where V: de::Visitor<'de>,125     fn deserialize_enum<V>(
126         self,
127         name: &'static str,
128         variants: &'static [&'static str],
129         visitor: V,
130     ) -> Result<V::Value>
131     where
132         V: de::Visitor<'de>,
133     {
134         visitor.visit_enum(EnumAccess {
135             value: self,
136             name,
137             variants,
138         })
139     }
140 
141     serde::forward_to_deserialize_any! {
142         char seq
143         bytes byte_buf map struct unit
144         identifier ignored_any unit_struct tuple_struct tuple
145     }
146 }
147 
148 struct StrDeserializer<'a>(&'a str);
149 
150 impl<'de, 'a> de::Deserializer<'de> for StrDeserializer<'a> {
151     type Error = ConfigError;
152 
153     #[inline]
deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>154     fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
155         visitor.visit_str(self.0)
156     }
157 
158     serde::forward_to_deserialize_any! {
159         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
160         bytes byte_buf map struct unit enum newtype_struct
161         identifier ignored_any unit_struct tuple_struct tuple option
162     }
163 }
164 
165 struct SeqAccess {
166     elements: Enumerate<::std::vec::IntoIter<Value>>,
167 }
168 
169 impl SeqAccess {
new(elements: Vec<Value>) -> Self170     fn new(elements: Vec<Value>) -> Self {
171         Self {
172             elements: elements.into_iter().enumerate(),
173         }
174     }
175 }
176 
177 impl<'de> de::SeqAccess<'de> for SeqAccess {
178     type Error = ConfigError;
179 
next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>> where T: de::DeserializeSeed<'de>,180     fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
181     where
182         T: de::DeserializeSeed<'de>,
183     {
184         match self.elements.next() {
185             Some((idx, value)) => seed
186                 .deserialize(value)
187                 .map(Some)
188                 .map_err(|e| e.prepend_index(idx)),
189             None => Ok(None),
190         }
191     }
192 
size_hint(&self) -> Option<usize>193     fn size_hint(&self) -> Option<usize> {
194         match self.elements.size_hint() {
195             (lower, Some(upper)) if lower == upper => Some(upper),
196             _ => None,
197         }
198     }
199 }
200 
201 struct MapAccess {
202     elements: VecDeque<(String, Value)>,
203 }
204 
205 impl MapAccess {
new(table: Map<String, Value>) -> Self206     fn new(table: Map<String, Value>) -> Self {
207         Self {
208             elements: table.into_iter().collect(),
209         }
210     }
211 }
212 
213 impl<'de> de::MapAccess<'de> for MapAccess {
214     type Error = ConfigError;
215 
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>> where K: de::DeserializeSeed<'de>,216     fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
217     where
218         K: de::DeserializeSeed<'de>,
219     {
220         if let Some(&(ref key_s, _)) = self.elements.front() {
221             let key_de = Value::new(None, key_s as &str);
222             let key = de::DeserializeSeed::deserialize(seed, key_de)?;
223 
224             Ok(Some(key))
225         } else {
226             Ok(None)
227         }
228     }
229 
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value> where V: de::DeserializeSeed<'de>,230     fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
231     where
232         V: de::DeserializeSeed<'de>,
233     {
234         let (key, value) = self.elements.pop_front().unwrap();
235         de::DeserializeSeed::deserialize(seed, value).map_err(|e| e.prepend_key(&key))
236     }
237 }
238 
239 struct EnumAccess {
240     value: Value,
241     name: &'static str,
242     variants: &'static [&'static str],
243 }
244 
245 impl EnumAccess {
variant_deserializer(&self, name: &str) -> Result<StrDeserializer>246     fn variant_deserializer(&self, name: &str) -> Result<StrDeserializer> {
247         self.variants
248             .iter()
249             .find(|&&s| s == name)
250             .map(|&s| StrDeserializer(s))
251             .ok_or_else(|| self.no_constructor_error(name))
252     }
253 
table_deserializer(&self, table: &Table) -> Result<StrDeserializer>254     fn table_deserializer(&self, table: &Table) -> Result<StrDeserializer> {
255         if table.len() == 1 {
256             self.variant_deserializer(table.iter().next().unwrap().0)
257         } else {
258             Err(self.structural_error())
259         }
260     }
261 
no_constructor_error(&self, supposed_variant: &str) -> ConfigError262     fn no_constructor_error(&self, supposed_variant: &str) -> ConfigError {
263         ConfigError::Message(format!(
264             "enum {} does not have variant constructor {}",
265             self.name, supposed_variant
266         ))
267     }
268 
structural_error(&self) -> ConfigError269     fn structural_error(&self) -> ConfigError {
270         ConfigError::Message(format!(
271             "value of enum {} should be represented by either string or table with exactly one key",
272             self.name
273         ))
274     }
275 }
276 
277 impl<'de> de::EnumAccess<'de> for EnumAccess {
278     type Error = ConfigError;
279     type Variant = Self;
280 
variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)> where V: de::DeserializeSeed<'de>,281     fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
282     where
283         V: de::DeserializeSeed<'de>,
284     {
285         let value = {
286             let deserializer = match self.value.kind {
287                 ValueKind::String(ref s) => self.variant_deserializer(s),
288                 ValueKind::Table(ref t) => self.table_deserializer(t),
289                 _ => Err(self.structural_error()),
290             }?;
291             seed.deserialize(deserializer)?
292         };
293 
294         Ok((value, self))
295     }
296 }
297 
298 impl<'de> de::VariantAccess<'de> for EnumAccess {
299     type Error = ConfigError;
300 
unit_variant(self) -> Result<()>301     fn unit_variant(self) -> Result<()> {
302         Ok(())
303     }
304 
newtype_variant_seed<T>(self, seed: T) -> Result<T::Value> where T: de::DeserializeSeed<'de>,305     fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
306     where
307         T: de::DeserializeSeed<'de>,
308     {
309         match self.value.kind {
310             ValueKind::Table(t) => seed.deserialize(t.into_iter().next().unwrap().1),
311             _ => unreachable!(),
312         }
313     }
314 
tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,315     fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
316     where
317         V: de::Visitor<'de>,
318     {
319         match self.value.kind {
320             ValueKind::Table(t) => {
321                 de::Deserializer::deserialize_seq(t.into_iter().next().unwrap().1, visitor)
322             }
323             _ => unreachable!(),
324         }
325     }
326 
struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,327     fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
328     where
329         V: de::Visitor<'de>,
330     {
331         match self.value.kind {
332             ValueKind::Table(t) => {
333                 de::Deserializer::deserialize_map(t.into_iter().next().unwrap().1, visitor)
334             }
335             _ => unreachable!(),
336         }
337     }
338 }
339 
340 impl<'de> de::Deserializer<'de> for Config {
341     type Error = ConfigError;
342 
343     #[inline]
deserialize_any<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,344     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
345     where
346         V: de::Visitor<'de>,
347     {
348         // Deserialize based on the underlying type
349         match self.cache.kind {
350             ValueKind::Nil => visitor.visit_unit(),
351             ValueKind::I64(i) => visitor.visit_i64(i),
352             ValueKind::I128(i) => visitor.visit_i128(i),
353             ValueKind::U64(i) => visitor.visit_u64(i),
354             ValueKind::U128(i) => visitor.visit_u128(i),
355             ValueKind::Boolean(b) => visitor.visit_bool(b),
356             ValueKind::Float(f) => visitor.visit_f64(f),
357             ValueKind::String(s) => visitor.visit_string(s),
358             ValueKind::Array(values) => visitor.visit_seq(SeqAccess::new(values)),
359             ValueKind::Table(map) => visitor.visit_map(MapAccess::new(map)),
360         }
361     }
362 
363     #[inline]
deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>364     fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
365         visitor.visit_bool(self.cache.into_bool()?)
366     }
367 
368     #[inline]
deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>369     fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
370         // FIXME: This should *fail* if the value does not fit in the requets integer type
371         visitor.visit_i8(self.cache.into_int()? as i8)
372     }
373 
374     #[inline]
deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>375     fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
376         // FIXME: This should *fail* if the value does not fit in the requets integer type
377         visitor.visit_i16(self.cache.into_int()? as i16)
378     }
379 
380     #[inline]
deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>381     fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
382         // FIXME: This should *fail* if the value does not fit in the requets integer type
383         visitor.visit_i32(self.cache.into_int()? as i32)
384     }
385 
386     #[inline]
deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>387     fn deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
388         visitor.visit_i64(self.cache.into_int()?)
389     }
390 
391     #[inline]
deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>392     fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
393         // FIXME: This should *fail* if the value does not fit in the requets integer type
394         visitor.visit_u8(self.cache.into_int()? as u8)
395     }
396 
397     #[inline]
deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>398     fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
399         // FIXME: This should *fail* if the value does not fit in the requets integer type
400         visitor.visit_u16(self.cache.into_int()? as u16)
401     }
402 
403     #[inline]
deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>404     fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
405         // FIXME: This should *fail* if the value does not fit in the requets integer type
406         visitor.visit_u32(self.cache.into_int()? as u32)
407     }
408 
409     #[inline]
deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>410     fn deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
411         // FIXME: This should *fail* if the value does not fit in the requets integer type
412         visitor.visit_u64(self.cache.into_int()? as u64)
413     }
414 
415     #[inline]
deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>416     fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
417         visitor.visit_f32(self.cache.into_float()? as f32)
418     }
419 
420     #[inline]
deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>421     fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
422         visitor.visit_f64(self.cache.into_float()?)
423     }
424 
425     #[inline]
deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>426     fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
427         visitor.visit_string(self.cache.into_string()?)
428     }
429 
430     #[inline]
deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>431     fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
432         visitor.visit_string(self.cache.into_string()?)
433     }
434 
435     #[inline]
deserialize_option<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,436     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
437     where
438         V: de::Visitor<'de>,
439     {
440         // Match an explicit nil as None and everything else as Some
441         match self.cache.kind {
442             ValueKind::Nil => visitor.visit_none(),
443             _ => visitor.visit_some(self),
444         }
445     }
446 
deserialize_enum<V>( self, name: &'static str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value> where V: de::Visitor<'de>,447     fn deserialize_enum<V>(
448         self,
449         name: &'static str,
450         variants: &'static [&'static str],
451         visitor: V,
452     ) -> Result<V::Value>
453     where
454         V: de::Visitor<'de>,
455     {
456         visitor.visit_enum(EnumAccess {
457             value: self.cache,
458             name,
459             variants,
460         })
461     }
462 
463     serde::forward_to_deserialize_any! {
464         char seq
465         bytes byte_buf map struct unit newtype_struct
466         identifier ignored_any unit_struct tuple_struct tuple
467     }
468 }
469