libconfig_rs/serde/
deserialize.rs

1use super::error::Error;
2use crate::Value;
3use serde::{
4    de::{self, DeserializeSeed, EnumAccess, MapAccess, SeqAccess, VariantAccess, Visitor},
5    Deserialize,
6};
7use std::{collections::VecDeque, marker::PhantomData, str::FromStr};
8
9// Example
10// https://serde.rs/data-format.html
11// https://github.com/serde-rs/example-format
12
13#[derive(Clone, Debug)]
14enum Token {
15    Bool(bool),
16    Int(i64),
17    Float(f64),
18    String(String),
19    Count(usize),
20}
21
22impl Token {
23    fn into_bool(self) -> Result<bool, Token> {
24        match self {
25            Token::Bool(v) => Ok(v),
26            _ => Err(self),
27        }
28    }
29
30    fn into_int(self) -> Result<i64, Token> {
31        match self {
32            Token::Int(v) => Ok(v),
33            _ => Err(self),
34        }
35    }
36
37    fn into_float(self) -> Result<f64, Token> {
38        match self {
39            Token::Float(v) => Ok(v),
40            _ => Err(self),
41        }
42    }
43
44    fn into_string(self) -> Result<String, Token> {
45        match self {
46            Token::String(v) => Ok(v),
47            _ => Err(self),
48        }
49    }
50
51    fn into_count(self) -> Result<usize, Token> {
52        match self {
53            Token::Count(v) => Ok(v),
54            _ => Err(self),
55        }
56    }
57}
58
59fn flatten(res: &mut VecDeque<Token>, value: Value) {
60    match value {
61        Value::Bool(b) => {
62            res.push_back(Token::Bool(b));
63        }
64        Value::Int(i) => {
65            res.push_back(Token::Int(i));
66        }
67        Value::Float(f) => {
68            res.push_back(Token::Float(f));
69        }
70        Value::String(s) => {
71            res.push_back(Token::String(s));
72        }
73        Value::Array(a, _) => {
74            res.push_back(Token::Count(a.len()));
75            for v in a {
76                flatten(res, v)
77            }
78        }
79        Value::Object(o) => {
80            res.push_back(Token::Count(o.len()));
81            for (k, v) in o {
82                res.push_back(Token::String(k));
83                flatten(res, v)
84            }
85        }
86    }
87}
88
89pub struct Deserializer<'de> {
90    tokens: VecDeque<Token>,
91    phantom: PhantomData<&'de str>,
92}
93
94pub fn from_str<'a, T>(s: &'a str) -> Result<T, Error>
95where
96    T: Deserialize<'a>,
97{
98    let value = crate::Value::from_str(s).map_err(|e| Error::Message(format!("{e:?}")))?;
99
100    let mut tokens = VecDeque::new();
101
102    flatten(&mut tokens, value);
103
104    let mut deserializer = Deserializer::<'a> {
105        tokens,
106        phantom: PhantomData,
107    };
108
109    T::deserialize(&mut deserializer)
110}
111
112impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
113    type Error = Error;
114
115    fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
116    where
117        V: Visitor<'de>,
118    {
119        panic!("Format needs type hints!");
120    }
121
122    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
123    where
124        V: Visitor<'de>,
125    {
126        let token = self
127            .tokens
128            .pop_front()
129            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
130
131        visitor.visit_bool(
132            token
133                .into_bool()
134                .map_err(|t| Error::Message(format!("{t:?} is not a bool")))?,
135        )
136    }
137
138    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
139    where
140        V: Visitor<'de>,
141    {
142        let token = self
143            .tokens
144            .pop_front()
145            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
146
147        visitor.visit_i8(
148            token
149                .into_int()
150                .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as i8,
151        )
152    }
153
154    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
155    where
156        V: Visitor<'de>,
157    {
158        let token = self
159            .tokens
160            .pop_front()
161            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
162
163        visitor.visit_i16(
164            token
165                .into_int()
166                .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as i16,
167        )
168    }
169
170    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
171    where
172        V: Visitor<'de>,
173    {
174        let token = self
175            .tokens
176            .pop_front()
177            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
178
179        visitor.visit_i32(
180            token
181                .into_int()
182                .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as i32,
183        )
184    }
185
186    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
187    where
188        V: Visitor<'de>,
189    {
190        let token = self
191            .tokens
192            .pop_front()
193            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
194
195        visitor.visit_i64(
196            token
197                .into_int()
198                .map_err(|t| Error::Message(format!("{t:?} is not a integer")))?,
199        )
200    }
201
202    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
203    where
204        V: Visitor<'de>,
205    {
206        let token = self
207            .tokens
208            .pop_front()
209            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
210
211        visitor.visit_u8(
212            token
213                .into_int()
214                .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as u8,
215        )
216    }
217
218    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
219    where
220        V: Visitor<'de>,
221    {
222        let token = self
223            .tokens
224            .pop_front()
225            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
226
227        visitor.visit_u16(
228            token
229                .into_int()
230                .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as u16,
231        )
232    }
233
234    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
235    where
236        V: Visitor<'de>,
237    {
238        let token = self
239            .tokens
240            .pop_front()
241            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
242
243        visitor.visit_u32(
244            token
245                .into_int()
246                .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as u32,
247        )
248    }
249
250    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
251    where
252        V: Visitor<'de>,
253    {
254        let token = self
255            .tokens
256            .pop_front()
257            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
258
259        visitor.visit_u64(
260            token
261                .into_int()
262                .map_err(|t| Error::Message(format!("{t:?} is not a integer")))? as u64,
263        )
264    }
265
266    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
267    where
268        V: Visitor<'de>,
269    {
270        let token = self
271            .tokens
272            .pop_front()
273            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
274
275        visitor.visit_f32(
276            token
277                .into_float()
278                .map_err(|t| Error::Message(format!("{t:?} is not a float")))? as f32,
279        )
280    }
281
282    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
283    where
284        V: Visitor<'de>,
285    {
286        let token = self
287            .tokens
288            .pop_front()
289            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
290
291        visitor.visit_f64(
292            token
293                .into_float()
294                .map_err(|t| Error::Message(format!("{t:?} is not a float")))?,
295        )
296    }
297
298    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
299    where
300        V: Visitor<'de>,
301    {
302        let token = self
303            .tokens
304            .pop_front()
305            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
306
307        visitor.visit_char(
308            token
309                .into_string()
310                .map_err(|t| Error::Message(format!("{t:?} is not a char")))?
311                .chars()
312                .next()
313                .ok_or_else(|| Error::Message("String is empty".into()))?,
314        )
315    }
316
317    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
318    where
319        V: Visitor<'de>,
320    {
321        let token = self
322            .tokens
323            .pop_front()
324            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
325
326        visitor.visit_str(
327            token
328                .into_string()
329                .map_err(|t| Error::Message(format!("{t:?} is not a str")))?
330                .as_str(),
331        )
332    }
333
334    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
335    where
336        V: Visitor<'de>,
337    {
338        let token = self
339            .tokens
340            .pop_front()
341            .ok_or_else(|| Error::Message("Reached end of input!".into()))?;
342
343        visitor.visit_string(
344            token
345                .into_string()
346                .map_err(|t| Error::Message(format!("{t:?} is not a str")))?,
347        )
348    }
349
350    fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
351    where
352        V: Visitor<'de>,
353    {
354        unimplemented!("")
355    }
356
357    fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
358    where
359        V: Visitor<'de>,
360    {
361        unimplemented!("")
362    }
363
364    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
365    where
366        V: Visitor<'de>,
367    {
368        let len = self
369            .tokens
370            .pop_front()
371            .ok_or_else(|| Error::Message("Reached end of input!".into()))?
372            .into_count()
373            .map_err(|t| Error::Message(format!("{t:?} is not a count")))?;
374
375        if len == 0 {
376            visitor.visit_none()
377        } else {
378            visitor.visit_some(self)
379        }
380    }
381
382    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
383    where
384        V: Visitor<'de>,
385    {
386        let len = self
387            .tokens
388            .pop_front()
389            .ok_or_else(|| Error::Message("Reached end of input!".into()))?
390            .into_count()
391            .map_err(|t| Error::Message(format!("{t:?} is not a count")))?;
392
393        if len == 0 {
394            visitor.visit_unit()
395        } else {
396            Err(Error::Message("Expected empty list".into()))
397        }
398    }
399
400    fn deserialize_unit_struct<V>(
401        self,
402        _name: &'static str,
403        visitor: V,
404    ) -> Result<V::Value, Self::Error>
405    where
406        V: Visitor<'de>,
407    {
408        self.deserialize_unit(visitor)
409    }
410
411    fn deserialize_newtype_struct<V>(
412        self,
413        _name: &'static str,
414        visitor: V,
415    ) -> Result<V::Value, Self::Error>
416    where
417        V: Visitor<'de>,
418    {
419        let len = self
420            .tokens
421            .pop_front()
422            .ok_or_else(|| Error::Message("Reached end of input!".into()))?
423            .into_count()
424            .map_err(|t| Error::Message(format!("{t:?} is not a count")))?;
425
426        if len != 1 {
427            return Err(Error::Message(format!(
428                "Expected 1 field in struct got {len}"
429            )));
430        }
431
432        visitor.visit_newtype_struct(self)
433    }
434
435    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
436    where
437        V: Visitor<'de>,
438    {
439        let count = self
440            .tokens
441            .pop_front()
442            .ok_or_else(|| Error::Message("Reached end of input!".into()))?
443            .into_count()
444            .map_err(|t| Error::Message(format!("Expected field count, got {t:?}")))?;
445
446        visitor.visit_seq(SeqAccessor {
447            de: self,
448            remaining: count,
449        })
450    }
451
452    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
453    where
454        V: Visitor<'de>,
455    {
456        self.deserialize_seq(visitor)
457    }
458
459    fn deserialize_tuple_struct<V>(
460        self,
461        _name: &'static str,
462        _len: usize,
463        visitor: V,
464    ) -> Result<V::Value, Self::Error>
465    where
466        V: Visitor<'de>,
467    {
468        self.deserialize_seq(visitor)
469    }
470
471    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
472    where
473        V: Visitor<'de>,
474    {
475        let count = self
476            .tokens
477            .pop_front()
478            .ok_or_else(|| Error::Message("Reached end of input!".into()))?
479            .into_count()
480            .map_err(|t| Error::Message(format!("Expected field count, got {t:?}")))?;
481
482        visitor.visit_map(MapAccessor {
483            de: self,
484            remaining: count,
485        })
486    }
487
488    fn deserialize_struct<V>(
489        self,
490        _name: &'static str,
491        _fields: &'static [&'static str],
492        visitor: V,
493    ) -> Result<V::Value, Self::Error>
494    where
495        V: Visitor<'de>,
496    {
497        let count = self
498            .tokens
499            .pop_front()
500            .ok_or_else(|| Error::Message("Reached end of input!".into()))?
501            .into_count()
502            .map_err(|t| Error::Message(format!("Expected field count, got {t:?}")))?;
503
504        visitor.visit_map(StructAccessor {
505            de: self,
506            remaining: count,
507        })
508    }
509
510    fn deserialize_enum<V>(
511        self,
512        _name: &'static str,
513        _variants: &'static [&'static str],
514        visitor: V,
515    ) -> Result<V::Value, Self::Error>
516    where
517        V: Visitor<'de>,
518    {
519        if let Some(Token::Count(_)) = self.tokens.front() {
520            self.tokens.pop_front();
521        };
522
523        visitor.visit_enum(Enum::new(self))
524    }
525
526    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
527    where
528        V: Visitor<'de>,
529    {
530        let token = self
531            .tokens
532            .pop_front()
533            .ok_or_else(|| Error::Message("Reached end of input!".into()))?
534            .into_string()
535            .map_err(|t| Error::Message(format!("{t:?} is not an identifier")))?;
536
537        visitor.visit_str(token.as_str())
538    }
539
540    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
541    where
542        V: Visitor<'de>,
543    {
544        self.deserialize_any(visitor)
545    }
546}
547
548struct SeqAccessor<'a, 'de: 'a> {
549    de: &'a mut Deserializer<'de>,
550    remaining: usize,
551}
552
553impl<'de, 'a> SeqAccess<'de> for SeqAccessor<'a, 'de> {
554    type Error = Error;
555
556    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
557    where
558        T: DeserializeSeed<'de>,
559    {
560        if self.remaining > 0 {
561            self.remaining -= 1;
562            seed.deserialize(&mut *self.de).map(Some)
563        } else {
564            Ok(None)
565        }
566    }
567}
568
569struct StructAccessor<'a, 'de: 'a> {
570    de: &'a mut Deserializer<'de>,
571    remaining: usize,
572}
573
574impl<'de, 'a> MapAccess<'de> for StructAccessor<'a, 'de> {
575    type Error = Error;
576
577    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
578    where
579        K: DeserializeSeed<'de>,
580    {
581        if self.remaining > 0 {
582            self.remaining -= 1;
583            seed.deserialize(&mut *self.de).map(Some)
584        } else {
585            Ok(None)
586        }
587    }
588
589    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
590    where
591        V: DeserializeSeed<'de>,
592    {
593        seed.deserialize(&mut *self.de)
594    }
595}
596
597struct MapAccessor<'a, 'de: 'a> {
598    de: &'a mut Deserializer<'de>,
599    remaining: usize,
600}
601
602impl<'de, 'a> MapAccess<'de> for MapAccessor<'a, 'de> {
603    type Error = Error;
604
605    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
606    where
607        K: DeserializeSeed<'de>,
608    {
609        if self.remaining > 0 {
610            self.remaining -= 1;
611            let count = self
612                .de
613                .tokens
614                .pop_front()
615                .ok_or_else(|| Error::Message("Reached end of input!".into()))?
616                .into_count()
617                .map_err(|t| Error::Message(format!("{t:?} is not a count")))?;
618
619            if count != 2 {
620                return Err(Error::Message(
621                    "Map does not contain list of key value pairs".into(),
622                ));
623            }
624
625            seed.deserialize(&mut *self.de).map(Some)
626        } else {
627            Ok(None)
628        }
629    }
630
631    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
632    where
633        V: DeserializeSeed<'de>,
634    {
635        seed.deserialize(&mut *self.de)
636    }
637}
638
639struct Enum<'a, 'de: 'a> {
640    de: &'a mut Deserializer<'de>,
641}
642
643impl<'a, 'de> Enum<'a, 'de> {
644    fn new(de: &'a mut Deserializer<'de>) -> Self {
645        Enum { de }
646    }
647}
648
649impl<'de, 'a> EnumAccess<'de> for Enum<'a, 'de> {
650    type Error = Error;
651    type Variant = Self;
652
653    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
654    where
655        V: DeserializeSeed<'de>,
656    {
657        Ok((seed.deserialize(&mut *self.de)?, self))
658    }
659}
660
661impl<'de, 'a> VariantAccess<'de> for Enum<'a, 'de> {
662    type Error = Error;
663
664    fn unit_variant(self) -> Result<(), Self::Error> {
665        Ok(())
666    }
667
668    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
669    where
670        T: DeserializeSeed<'de>,
671    {
672        self.de.tokens.pop_front();
673        seed.deserialize(self.de)
674    }
675
676    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
677    where
678        V: Visitor<'de>,
679    {
680        de::Deserializer::deserialize_seq(self.de, visitor)
681    }
682
683    fn struct_variant<V>(
684        self,
685        _fields: &'static [&'static str],
686        visitor: V,
687    ) -> Result<V::Value, Self::Error>
688    where
689        V: Visitor<'de>,
690    {
691        de::Deserializer::deserialize_struct(self.de, "", &[], visitor)
692    }
693}