1mod parse;
40
41use crate::error::*;
42
43use serde::de;
44use serde::de::IntoDeserializer;
45
46use std::borrow::Cow;
47use std::collections::btree_map::{BTreeMap, Entry, IntoIter};
48
49pub struct Config {
84 max_depth: usize,
87 strict: bool,
89}
90
91impl Default for Config {
92 fn default() -> Self {
93 Self::new(5, true)
94 }
95}
96
97impl Config {
98 pub fn new(max_depth: usize, strict: bool) -> Self {
100 Self { max_depth, strict }
101 }
102
103 fn max_depth(&self) -> usize {
105 self.max_depth
106 }
107}
108
109impl Config {
110 pub fn deserialize_bytes<'de, T: de::Deserialize<'de>>(&self, input: &'de [u8]) -> Result<T> {
112 T::deserialize(QsDeserializer::with_config(self, input)?)
113 }
114
115 pub fn deserialize_str<'de, T: de::Deserialize<'de>>(&self, input: &'de str) -> Result<T> {
126 self.deserialize_bytes(input.as_bytes())
127 }
128}
129
130pub fn from_bytes<'de, T: de::Deserialize<'de>>(input: &'de [u8]) -> Result<T> {
157 Config::default().deserialize_bytes(input)
158}
159
160pub fn from_str<'de, T: de::Deserialize<'de>>(input: &'de str) -> Result<T> {
186 from_bytes(input.as_bytes())
187}
188
189pub(crate) struct QsDeserializer<'a> {
193 iter: IntoIter<Cow<'a, str>, Level<'a>>,
194 value: Option<Level<'a>>,
195}
196
197#[derive(Debug)]
198enum Level<'a> {
199 Nested(BTreeMap<Cow<'a, str>, Level<'a>>),
200 OrderedSeq(BTreeMap<usize, Level<'a>>),
201 Sequence(Vec<Level<'a>>),
202 Flat(Cow<'a, str>),
203 Invalid(&'static str),
204 Uninitialised,
205}
206
207impl<'a> QsDeserializer<'a> {
208 fn with_map(map: BTreeMap<Cow<'a, str>, Level<'a>>) -> Self {
209 QsDeserializer {
210 iter: map.into_iter(),
211 value: None,
212 }
213 }
214
215 fn with_config(config: &Config, input: &'a [u8]) -> Result<Self> {
217 parse::Parser::new(input, config.max_depth(), config.strict).as_deserializer()
218 }
219}
220
221impl<'de> de::Deserializer<'de> for QsDeserializer<'de> {
222 type Error = Error;
223
224 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value>
225 where
226 V: de::Visitor<'de>,
227 {
228 Err(Error::top_level("primitive"))
229 }
230
231 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
232 where
233 V: de::Visitor<'de>,
234 {
235 visitor.visit_map(self)
236 }
237
238 fn deserialize_struct<V>(
239 self,
240 _name: &'static str,
241 _fields: &'static [&'static str],
242 visitor: V,
243 ) -> Result<V::Value>
244 where
245 V: de::Visitor<'de>,
246 {
247 self.deserialize_map(visitor)
248 }
249
250 fn deserialize_seq<V>(self, _visitor: V) -> Result<V::Value>
254 where
255 V: de::Visitor<'de>,
256 {
257 Err(Error::top_level("sequence"))
258 }
259
260 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
261 where
262 V: de::Visitor<'de>,
263 {
264 self.deserialize_map(visitor)
265 }
266
267 fn deserialize_tuple<V>(self, _len: usize, _visitor: V) -> Result<V::Value>
271 where
272 V: de::Visitor<'de>,
273 {
274 Err(Error::top_level("tuple"))
275 }
276
277 fn deserialize_tuple_struct<V>(
281 self,
282 _name: &'static str,
283 _len: usize,
284 _visitor: V,
285 ) -> Result<V::Value>
286 where
287 V: de::Visitor<'de>,
288 {
289 Err(Error::top_level("tuple struct"))
290 }
291
292 fn deserialize_enum<V>(
293 self,
294 _name: &'static str,
295 _variants: &'static [&'static str],
296 visitor: V,
297 ) -> Result<V::Value>
298 where
299 V: de::Visitor<'de>,
300 {
301 visitor.visit_enum(self)
302 }
303
304 forward_to_deserialize_any! {
305 bool
306 u8
307 u16
308 u32
309 u64
310 i8
311 i16
312 i32
313 i64
314 f32
315 f64
316 char
317 str
318 string
319 unit
320 option
321 bytes
322 byte_buf
323 unit_struct
324 identifier
325 ignored_any
326 }
327}
328
329impl<'de> de::MapAccess<'de> for QsDeserializer<'de> {
330 type Error = Error;
331
332 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
333 where
334 K: de::DeserializeSeed<'de>,
335 {
336 if let Some((key, value)) = self.iter.next() {
337 self.value = Some(value);
338 return seed.deserialize(ParsableStringDeserializer(key)).map(Some);
339 };
340 Ok(None)
341 }
342
343 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
344 where
345 V: de::DeserializeSeed<'de>,
346 {
347 if let Some(v) = self.value.take() {
348 seed.deserialize(LevelDeserializer(v))
349 } else {
350 Err(de::Error::custom(
351 "Somehow the list was empty after a \
352 non-empty key was returned",
353 ))
354 }
355 }
356}
357
358impl<'de> de::EnumAccess<'de> for QsDeserializer<'de> {
359 type Error = Error;
360 type Variant = Self;
361
362 fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant)>
363 where
364 V: de::DeserializeSeed<'de>,
365 {
366 if let Some((key, value)) = self.iter.next() {
367 self.value = Some(value);
368 Ok((seed.deserialize(ParsableStringDeserializer(key))?, self))
369 } else {
370 Err(de::Error::custom("No more values"))
371 }
372 }
373}
374
375impl<'de> de::VariantAccess<'de> for QsDeserializer<'de> {
376 type Error = Error;
377 fn unit_variant(self) -> Result<()> {
378 Ok(())
379 }
380
381 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
382 where
383 T: de::DeserializeSeed<'de>,
384 {
385 if let Some(value) = self.value {
386 seed.deserialize(LevelDeserializer(value))
387 } else {
388 Err(de::Error::custom("no value to deserialize"))
389 }
390 }
391 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
392 where
393 V: de::Visitor<'de>,
394 {
395 if let Some(value) = self.value {
396 de::Deserializer::deserialize_seq(LevelDeserializer(value), visitor)
397 } else {
398 Err(de::Error::custom("no value to deserialize"))
399 }
400 }
401 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
402 where
403 V: de::Visitor<'de>,
404 {
405 if let Some(value) = self.value {
406 de::Deserializer::deserialize_map(LevelDeserializer(value), visitor)
407 } else {
408 Err(de::Error::custom("no value to deserialize"))
409 }
410 }
411}
412
413impl<'de> de::EnumAccess<'de> for LevelDeserializer<'de> {
414 type Error = Error;
415 type Variant = Self;
416
417 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
418 where
419 V: de::DeserializeSeed<'de>,
420 {
421 match self.0 {
422 Level::Flat(x) => Ok((
423 seed.deserialize(ParsableStringDeserializer(x))?,
424 LevelDeserializer(Level::Invalid(
425 "this value can only \
426 deserialize to a \
427 UnitVariant",
428 )),
429 )),
430 _ => Err(de::Error::custom(
431 "this value can only deserialize to a \
432 UnitVariant",
433 )),
434 }
435 }
436}
437
438impl<'de> de::VariantAccess<'de> for LevelDeserializer<'de> {
439 type Error = Error;
440 fn unit_variant(self) -> Result<()> {
441 Ok(())
442 }
443
444 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
445 where
446 T: de::DeserializeSeed<'de>,
447 {
448 seed.deserialize(self)
449 }
450 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
451 where
452 V: de::Visitor<'de>,
453 {
454 de::Deserializer::deserialize_seq(self, visitor)
455 }
456 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
457 where
458 V: de::Visitor<'de>,
459 {
460 de::Deserializer::deserialize_map(self, visitor)
461 }
462}
463
464struct LevelSeq<'a, I: Iterator<Item = Level<'a>>>(I);
465
466impl<'de, I: Iterator<Item = Level<'de>>> de::SeqAccess<'de> for LevelSeq<'de, I> {
467 type Error = Error;
468 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
469 where
470 T: de::DeserializeSeed<'de>,
471 {
472 if let Some(v) = self.0.next() {
473 seed.deserialize(LevelDeserializer(v)).map(Some)
474 } else {
475 Ok(None)
476 }
477 }
478}
479
480struct LevelDeserializer<'a>(Level<'a>);
481
482macro_rules! deserialize_primitive {
483 ($ty:ident, $method:ident, $visit_method:ident) => {
484 fn $method<V>(self, visitor: V) -> Result<V::Value>
485 where
486 V: de::Visitor<'de>,
487 {
488 match self.0 {
489 Level::Nested(_) => Err(de::Error::custom(format!(
490 "Expected: {:?}, got a Map",
491 stringify!($ty)
492 ))),
493 Level::OrderedSeq(_) => Err(de::Error::custom(format!(
494 "Expected: {:?}, got an OrderedSequence",
495 stringify!($ty)
496 ))),
497 Level::Sequence(_) => Err(de::Error::custom(format!(
498 "Expected: {:?}, got a Sequence",
499 stringify!($ty)
500 ))),
501 Level::Flat(x) => ParsableStringDeserializer(x).$method(visitor),
502 Level::Invalid(e) => Err(de::Error::custom(e)),
503 Level::Uninitialised => Err(de::Error::custom(
504 "attempted to deserialize unitialised value",
505 )),
506 }
507 }
508 };
509}
510
511impl<'a> LevelDeserializer<'a> {
512 fn into_deserializer(self) -> Result<QsDeserializer<'a>> {
513 match self.0 {
514 Level::Nested(map) => Ok(QsDeserializer::with_map(map)),
515 Level::OrderedSeq(map) => Ok(QsDeserializer::with_map(
516 map.into_iter()
517 .map(|(k, v)| (Cow::Owned(k.to_string()), v))
518 .collect(),
519 )),
520 Level::Invalid(e) => Err(de::Error::custom(e)),
521 l => Err(de::Error::custom(format!(
522 "could not convert {:?} to \
523 QsDeserializer<'a>",
524 l
525 ))),
526 }
527 }
528}
529
530impl<'de> de::Deserializer<'de> for LevelDeserializer<'de> {
531 type Error = Error;
532
533 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
534 where
535 V: de::Visitor<'de>,
536 {
537 match self.0 {
538 Level::Nested(_) => self.into_deserializer()?.deserialize_map(visitor),
539 Level::OrderedSeq(map) => visitor.visit_seq(LevelSeq(map.into_iter().map(|(_k, v)| v))),
540 Level::Sequence(seq) => visitor.visit_seq(LevelSeq(seq.into_iter())),
541 Level::Flat(x) => match x {
542 Cow::Owned(s) => visitor.visit_string(s),
543 Cow::Borrowed(s) => visitor.visit_borrowed_str(s),
544 },
545 Level::Invalid(e) => Err(de::Error::custom(e)),
546 Level::Uninitialised => Err(de::Error::custom(
547 "attempted to deserialize unitialised \
548 value",
549 )),
550 }
551 }
552
553 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
554 where
555 V: de::Visitor<'de>,
556 {
557 match self.0 {
558 Level::Flat(ref x) if x == "" => visitor.visit_none(),
559 _ => visitor.visit_some(self),
560 }
561 }
562
563 fn deserialize_enum<V>(
564 self,
565 name: &'static str,
566 variants: &'static [&'static str],
567 visitor: V,
568 ) -> Result<V::Value>
569 where
570 V: de::Visitor<'de>,
571 {
572 match self.0 {
573 Level::Nested(map) => {
574 QsDeserializer::with_map(map).deserialize_enum(name, variants, visitor)
575 }
576 Level::Flat(_) => visitor.visit_enum(self),
577 x => Err(de::Error::custom(format!(
578 "{:?} does not appear to be \
579 an enum",
580 x
581 ))),
582 }
583 }
584
585 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
586 where
587 V: de::Visitor<'de>,
588 {
589 match self.0 {
590 Level::Nested(_) => self.into_deserializer()?.deserialize_map(visitor),
591 Level::OrderedSeq(map) => visitor.visit_seq(LevelSeq(map.into_iter().map(|(_k, v)| v))),
592 Level::Sequence(seq) => visitor.visit_seq(LevelSeq(seq.into_iter())),
593 Level::Flat(_) => {
594 visitor.visit_seq(LevelSeq(vec![self.0].into_iter()))
597 }
598 Level::Invalid(e) => Err(de::Error::custom(e)),
599 Level::Uninitialised => Err(de::Error::custom(
600 "attempted to deserialize unitialised \
601 value",
602 )),
603 }
604 }
605
606 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
610 where
611 V: de::Visitor<'de>,
612 {
613 match self.0 {
614 Level::OrderedSeq(_) => self.into_deserializer()?.deserialize_map(visitor),
615 _ => self.deserialize_any(visitor),
616 }
617 }
618
619 deserialize_primitive!(bool, deserialize_bool, visit_bool);
620 deserialize_primitive!(i8, deserialize_i8, visit_i8);
621 deserialize_primitive!(i16, deserialize_i16, visit_i16);
622 deserialize_primitive!(i32, deserialize_i32, visit_i32);
623 deserialize_primitive!(i64, deserialize_i64, visit_i64);
624 deserialize_primitive!(u8, deserialize_u8, visit_u8);
625 deserialize_primitive!(u16, deserialize_u16, visit_u16);
626 deserialize_primitive!(u32, deserialize_u32, visit_u32);
627 deserialize_primitive!(u64, deserialize_u64, visit_u64);
628 deserialize_primitive!(f32, deserialize_f32, visit_f32);
629 deserialize_primitive!(f64, deserialize_f64, visit_f64);
630
631 forward_to_deserialize_any! {
632 char
633 str
634 string
635 bytes
636 byte_buf
637 unit
638 unit_struct
639 tuple_struct
641 struct
642 identifier
643 tuple
644 ignored_any
645 seq
646 }
648}
649
650macro_rules! forward_parsable_to_deserialize_any {
651 ($($ty:ident => $meth:ident,)*) => {
652 $(
653 fn $meth<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de> {
654 match self.0.parse::<$ty>() {
655 Ok(val) => val.into_deserializer().$meth(visitor),
656 Err(e) => Err(de::Error::custom(e))
657 }
658 }
659 )*
660 }
661}
662
663struct ParsableStringDeserializer<'a>(Cow<'a, str>);
664
665impl<'de> de::Deserializer<'de> for ParsableStringDeserializer<'de> {
666 type Error = Error;
667
668 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
669 where
670 V: de::Visitor<'de>,
671 {
672 self.0.into_deserializer().deserialize_any(visitor)
673 }
674
675 fn deserialize_enum<V>(
676 self,
677 _: &'static str,
678 _: &'static [&'static str],
679 visitor: V,
680 ) -> Result<V::Value>
681 where
682 V: de::Visitor<'de>,
683 {
684 visitor.visit_enum(LevelDeserializer(Level::Flat(self.0)))
685 }
686
687 forward_to_deserialize_any! {
688 map
689 struct
690 seq
691 option
692 char
693 str
694 string
695 unit
696 bytes
697 byte_buf
698 unit_struct
699 newtype_struct
700 tuple_struct
701 identifier
702 tuple
703 ignored_any
704 }
705
706 forward_parsable_to_deserialize_any! {
707 bool => deserialize_bool,
708 u8 => deserialize_u8,
709 u16 => deserialize_u16,
710 u32 => deserialize_u32,
711 u64 => deserialize_u64,
712 i8 => deserialize_i8,
713 i16 => deserialize_i16,
714 i32 => deserialize_i32,
715 i64 => deserialize_i64,
716 f32 => deserialize_f32,
717 f64 => deserialize_f64,
718 }
719}