1mod parse;
68mod string_parser;
69
70use crate::{
71 Config,
72 config::DuplicateKeyBehavior,
73 error::{Error, Result},
74};
75
76use parse::{Key, ParsedValue};
77use serde::de;
78use serde::forward_to_deserialize_any;
79use string_parser::StringParsingDeserializer;
80
81use std::borrow::Cow;
82
83pub fn from_bytes<'de, T: de::Deserialize<'de>>(input: &'de [u8]) -> Result<T> {
106 Config::default().deserialize_bytes(input)
107}
108
109pub fn from_str<'de, T: de::Deserialize<'de>>(input: &'de str) -> Result<T> {
131 from_bytes(input.as_bytes())
132}
133
134pub struct QsDeserializer<'a> {
139 value: ParsedValue<'a>,
140 config: Config,
141}
142
143impl<'a> QsDeserializer<'a> {
144 pub fn new(input: &'a [u8]) -> Result<Self> {
145 Self::with_config(Default::default(), input)
146 }
147
148 pub fn with_config(config: Config, input: &'a [u8]) -> Result<Self> {
149 let parsed = parse::parse(input, config)?;
150
151 Ok(Self {
152 value: parsed,
153 config,
154 })
155 }
156
157 fn from_value(value: ParsedValue<'a>, config: Config) -> Self {
159 Self { value, config }
160 }
161}
162
163struct MapDeserializer<'a, 'qs: 'a> {
164 parsed: &'a mut parse::ParsedMap<'qs>,
165 field_order: Option<&'static [&'static str]>,
166 popped_value: Option<ParsedValue<'qs>>,
167 config: Config,
168}
169
170impl<'a, 'de: 'a> de::MapAccess<'de> for MapDeserializer<'a, 'de> {
171 type Error = Error;
172
173 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
174 where
175 K: de::DeserializeSeed<'de>,
176 {
177 if let Some(field_order) = &mut self.field_order {
179 while let Some((field, rem)) = field_order.split_first() {
180 *field_order = rem;
181 let field_key = (*field).into();
182 if let Some(value) = crate::map::remove(self.parsed, &field_key) {
183 self.popped_value = Some(value);
184 return seed
185 .deserialize(StringParsingDeserializer::new_str(field))
186 .map(Some);
187 }
188 }
189 }
190
191 if let Some((key, value)) = crate::map::pop_first(self.parsed) {
194 self.popped_value = Some(value);
195 let has_bracket = matches!(key, Key::String(ref s) if s.contains(&b'['));
196 key.deserialize_seed(seed)
197 .map(Some)
198 .map_err(|e| {
199 if has_bracket {
200 Error::custom(
201 format!("{e}\nInvalid field contains an encoded bracket -- consider using form encoding mode\n https://docs.rs/serde_qs/latest/serde_qs/#query-string-vs-form-encoding")
202 , &self.parsed
203 )
204 } else {
205 e
206 }
207 })
208 } else {
209 Ok(None)
210 }
211 }
212
213 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
214 where
215 V: de::DeserializeSeed<'de>,
216 {
217 if let Some(v) = self.popped_value.take() {
218 seed.deserialize(QsDeserializer::from_value(v, self.config))
219 } else {
220 Err(Error::custom(
221 "Somehow the map was empty after a non-empty key was returned",
222 &self.parsed,
223 ))
224 }
225 }
226
227 fn size_hint(&self) -> Option<usize> {
228 if let Some(field_order) = self.field_order {
229 Some(field_order.len())
230 } else {
231 Some(self.parsed.len())
232 }
233 }
234}
235
236impl<'a, 'de: 'a> de::EnumAccess<'de> for MapDeserializer<'a, 'de> {
237 type Error = Error;
238 type Variant = Self;
239
240 fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant)>
241 where
242 V: de::DeserializeSeed<'de>,
243 {
244 if let Some((key, value)) = crate::map::pop_first(self.parsed) {
245 self.popped_value = Some(value);
246 Ok((key.deserialize_seed(seed)?, self))
247 } else {
248 Err(Error::custom("No more values", &self.parsed))
249 }
250 }
251}
252
253impl<'a, 'de: 'a> de::VariantAccess<'de> for MapDeserializer<'a, 'de> {
254 type Error = Error;
255 fn unit_variant(self) -> Result<()> {
256 Ok(())
257 }
258
259 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
260 where
261 T: de::DeserializeSeed<'de>,
262 {
263 if let Some(value) = self.popped_value {
264 seed.deserialize(QsDeserializer::from_value(value, self.config))
265 } else {
266 Err(Error::custom("no value to deserialize", &self.parsed))
267 }
268 }
269 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
270 where
271 V: de::Visitor<'de>,
272 {
273 if let Some(value) = self.popped_value {
274 de::Deserializer::deserialize_seq(
275 QsDeserializer::from_value(value, self.config),
276 visitor,
277 )
278 } else {
279 Err(Error::custom("no value to deserialize", &self.parsed))
280 }
281 }
282 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
283 where
284 V: de::Visitor<'de>,
285 {
286 if let Some(value) = self.popped_value {
287 de::Deserializer::deserialize_map(
288 QsDeserializer::from_value(value, self.config),
289 visitor,
290 )
291 } else {
292 Err(Error::custom("no value to deserialize", &self.parsed))
293 }
294 }
295}
296
297struct Seq<'a, I: Iterator<Item = ParsedValue<'a>>> {
298 iter: I,
299 config: Config,
300}
301
302impl<'de, I: Iterator<Item = ParsedValue<'de>>> de::SeqAccess<'de> for Seq<'de, I> {
303 type Error = Error;
304 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
305 where
306 T: de::DeserializeSeed<'de>,
307 {
308 if let Some(v) = self.iter.next() {
309 seed.deserialize(QsDeserializer::from_value(v, self.config))
310 .map(Some)
311 } else {
312 Ok(None)
313 }
314 }
315
316 fn size_hint(&self) -> Option<usize> {
317 match self.iter.size_hint() {
318 (lower, Some(upper)) if lower == upper => Some(upper),
319 _ => None,
320 }
321 }
322}
323
324impl<'a, I> OrderedSeq<'a, I>
325where
326 I: Iterator<Item = (Key<'a>, ParsedValue<'a>)>,
327{
328 pub fn new(iter: I, config: Config) -> Self {
330 Self {
331 iter,
332 counter: 0,
333 config,
334 }
335 }
336}
337
338struct OrderedSeq<'a, I: Iterator<Item = (Key<'a>, ParsedValue<'a>)>> {
339 iter: I,
340 counter: u32,
341 config: Config,
342}
343
344impl<'de, I: Iterator<Item = (Key<'de>, ParsedValue<'de>)>> de::SeqAccess<'de>
345 for OrderedSeq<'de, I>
346{
347 type Error = Error;
348 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
349 where
350 T: de::DeserializeSeed<'de>,
351 {
352 if let Some((k, v)) = self.iter.next() {
353 match k {
354 Key::Int(i) if i == self.counter => {
355 self.counter = self.counter.checked_add(1).ok_or_else(|| {
356 Error::custom("cannot deserialize more than u32::MAX elements", &(k, &v))
357 })?;
358 seed.deserialize(QsDeserializer::from_value(v, self.config))
359 .map(Some)
360 }
361 Key::Int(i) => Err(Error::custom(
362 format!("missing index, expected: {} got {i}", self.counter),
363 &(k, v),
364 )),
365 Key::String(ref bytes) => {
366 let key = std::str::from_utf8(bytes).unwrap_or("<non-utf8>");
367 Err(Error::custom(
368 format!("expected an integer index, found a string key `{key}`"),
369 &(k, v),
370 ))
371 }
372 }
373 } else {
374 Ok(None)
375 }
376 }
377
378 fn size_hint(&self) -> Option<usize> {
379 None
381 }
382}
383
384fn get_last_string_value<'a>(
385 seq: &mut Vec<ParsedValue<'a>>,
386 config: Config,
387) -> Result<Option<Cow<'a, [u8]>>> {
388 if config.duplicate_key_behavior == DuplicateKeyBehavior::Error && seq.len() > 1 {
390 return Err(Error::custom(
391 "multiple values provided for non-sequence field",
392 seq,
393 ));
394 }
395
396 Ok(match seq.last() {
397 None => None,
398 Some(ParsedValue::NoValue | ParsedValue::Null) => {
399 Some(Cow::Borrowed(b""))
401 }
402 Some(ParsedValue::String(_)) => {
403 if let Some(ParsedValue::String(s)) = seq.pop() {
404 Some(s)
405 } else {
406 None
408 }
409 }
410 Some(_) => {
411 None
414 }
415 })
416}
417
418macro_rules! forward_to_string_parser {
419 ($($ty:ident => $meth:ident,)*) => {
420 $(
421 fn $meth<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de> {
422 let s = match self.value {
423 ParsedValue::String(s) => {
424 s
425 }
426 ParsedValue::Sequence(mut seq) => {
427 match get_last_string_value(&mut seq, self.config) {
428 Ok(Some(v)) => v,
429 Ok(None) => {
430 return Self::from_value(ParsedValue::Sequence(seq), self.config)
431 .deserialize_any(visitor);
432 }
433 Err(e) => return Err(e),
434 }
435 }
436 _ => {
437 return self.deserialize_any(visitor);
438 }
439 };
440 let deserializer = StringParsingDeserializer::new(s)?;
441 return deserializer.$meth(visitor);
442 }
443 )*
444 }
445}
446
447impl<'de> de::Deserializer<'de> for QsDeserializer<'de> {
448 type Error = Error;
449
450 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
451 where
452 V: de::Visitor<'de>,
453 {
454 match self.value {
455 ParsedValue::Map(mut parsed) => {
456 if parsed.keys().all(|k| matches!(k, Key::Int(_))) {
459 #[cfg(feature = "indexmap")]
460 parsed.sort_unstable_keys();
461 visitor.visit_seq(OrderedSeq::new(parsed.into_iter(), self.config))
462 } else {
463 visitor.visit_map(MapDeserializer {
464 parsed: &mut parsed,
465 field_order: None,
466 popped_value: None,
467 config: self.config,
468 })
469 }
470 }
471 ParsedValue::Sequence(seq) => visitor.visit_seq(Seq {
472 iter: seq.into_iter(),
473 config: self.config,
474 }),
475 ParsedValue::String(x) => StringParsingDeserializer::new(x)?.deserialize_any(visitor),
476 ParsedValue::Uninitialized => Err(Error::custom(
477 "internal error: attempted to deserialize unitialised \
478 value",
479 &self.value,
480 )),
481
482 ParsedValue::Null => {
483 StringParsingDeserializer::new(Cow::Borrowed(b""))?.deserialize_any(visitor)
484 }
485 ParsedValue::NoValue => visitor.visit_unit(),
486 }
487 }
488
489 fn deserialize_seq<V>(self, visitor: V) -> std::result::Result<V::Value, Self::Error>
490 where
491 V: de::Visitor<'de>,
492 {
493 match self.value {
494 ParsedValue::Null | ParsedValue::NoValue => visitor.visit_seq(Seq {
495 iter: std::iter::empty(),
496 config: self.config,
497 }),
498 ParsedValue::String(s) => visitor.visit_seq(Seq {
502 iter: std::iter::once(ParsedValue::String(s)),
503 config: self.config,
504 }),
505 _ => self.deserialize_any(visitor),
506 }
507 }
508
509 fn deserialize_tuple<V>(
510 self,
511 _len: usize,
512 visitor: V,
513 ) -> std::result::Result<V::Value, Self::Error>
514 where
515 V: de::Visitor<'de>,
516 {
517 self.deserialize_seq(visitor)
518 }
519
520 fn deserialize_tuple_struct<V>(
521 self,
522 _name: &'static str,
523 _len: usize,
524 visitor: V,
525 ) -> std::result::Result<V::Value, Self::Error>
526 where
527 V: de::Visitor<'de>,
528 {
529 self.deserialize_seq(visitor)
530 }
531
532 fn deserialize_struct<V>(
533 self,
534 _name: &'static str,
535 fields: &'static [&'static str],
536 visitor: V,
537 ) -> std::result::Result<V::Value, Self::Error>
538 where
539 V: de::Visitor<'de>,
540 {
541 let mut map = match self.value {
542 ParsedValue::Map(map) => map,
543 ParsedValue::Null | ParsedValue::NoValue => {
544 parse::ParsedMap::default()
546 }
547 _ => return self.deserialize_any(visitor),
548 };
549
550 visitor.visit_map(MapDeserializer {
551 parsed: &mut map,
552 field_order: Some(fields),
553 popped_value: None,
554 config: self.config,
555 })
556 }
557
558 fn deserialize_newtype_struct<V>(
559 self,
560 _name: &'static str,
561 visitor: V,
562 ) -> std::result::Result<V::Value, Self::Error>
563 where
564 V: de::Visitor<'de>,
565 {
566 visitor.visit_newtype_struct(self)
567 }
568
569 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
570 where
571 V: de::Visitor<'de>,
572 {
573 match self.value {
574 ParsedValue::NoValue => visitor.visit_none(),
575 ParsedValue::Null => visitor.visit_some(QsDeserializer::from_value(
578 ParsedValue::NoValue,
579 self.config,
580 )),
581 _ => visitor.visit_some(self),
582 }
583 }
584
585 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
586 where
587 V: de::Visitor<'de>,
588 {
589 if matches!(self.value, ParsedValue::Null)
591 || matches!(self.value, ParsedValue::String(ref s) if s.is_empty())
592 {
593 visitor.visit_unit()
594 } else {
595 self.deserialize_any(visitor)
596 }
597 }
598
599 fn deserialize_unit_struct<V>(
600 self,
601 _name: &'static str,
602 visitor: V,
603 ) -> std::result::Result<V::Value, Self::Error>
604 where
605 V: de::Visitor<'de>,
606 {
607 self.deserialize_unit(visitor)
608 }
609
610 fn deserialize_enum<V>(
611 self,
612 _name: &'static str,
613 _variants: &'static [&'static str],
614 visitor: V,
615 ) -> Result<V::Value>
616 where
617 V: de::Visitor<'de>,
618 {
619 match self.value {
620 ParsedValue::Map(mut parsed) => visitor.visit_enum(MapDeserializer {
621 parsed: &mut parsed,
622 field_order: None,
623 popped_value: None,
624 config: self.config,
625 }),
626 ParsedValue::String(s) => visitor.visit_enum(StringParsingDeserializer::new(s)?),
627 _ => self.deserialize_any(visitor),
628 }
629 }
630
631 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
635 where
636 V: de::Visitor<'de>,
637 {
638 match self.value {
639 ParsedValue::Map(mut parsed) => visitor.visit_map(MapDeserializer {
640 parsed: &mut parsed,
641 field_order: None,
642 popped_value: None,
643 config: self.config,
644 }),
645 ParsedValue::Null | ParsedValue::NoValue => {
646 let mut empty_map = parse::ParsedMap::default();
647 visitor.visit_map(MapDeserializer {
648 parsed: &mut empty_map,
649 field_order: None,
650 popped_value: None,
651 config: self.config,
652 })
653 }
654 ParsedValue::String(s) => {
655 let mut parsed = parse::ParsedMap::default();
663 parsed.insert(Key::String(Cow::Borrowed(b"")), ParsedValue::String(s));
664 visitor.visit_map(MapDeserializer {
665 parsed: &mut parsed,
666 field_order: None,
667 popped_value: None,
668 config: self.config,
669 })
670 }
671 _ => self.deserialize_any(visitor),
672 }
673 }
674
675 fn deserialize_str<V>(self, visitor: V) -> std::result::Result<V::Value, Self::Error>
676 where
677 V: de::Visitor<'de>,
678 {
679 let s = match self.value {
680 ParsedValue::String(s) => s,
681 ParsedValue::Sequence(mut seq) => match get_last_string_value(&mut seq, self.config) {
682 Ok(Some(v)) => v,
683 Ok(None) => {
684 return Self::from_value(ParsedValue::Sequence(seq), self.config)
685 .deserialize_any(visitor);
686 }
687 Err(e) => return Err(e),
688 },
689 ParsedValue::Null | ParsedValue::NoValue => {
690 return visitor.visit_str("");
691 }
692 _ => return self.deserialize_any(visitor),
693 };
694
695 match string_parser::decode_utf8(s)? {
696 Cow::Borrowed(string) => visitor.visit_borrowed_str(string),
697 Cow::Owned(string) => visitor.visit_string(string),
698 }
699 }
700
701 fn deserialize_string<V>(self, visitor: V) -> std::result::Result<V::Value, Self::Error>
702 where
703 V: de::Visitor<'de>,
704 {
705 self.deserialize_str(visitor)
706 }
707
708 fn deserialize_bytes<V>(self, visitor: V) -> std::result::Result<V::Value, Self::Error>
709 where
710 V: de::Visitor<'de>,
711 {
712 let s = match self.value {
713 ParsedValue::String(s) => s,
714 ParsedValue::Sequence(mut seq) => match get_last_string_value(&mut seq, self.config) {
715 Ok(Some(v)) => v,
716 Ok(None) => {
717 return Self::from_value(ParsedValue::Sequence(seq), self.config)
718 .deserialize_any(visitor);
719 }
720 Err(e) => return Err(e),
721 },
722 ParsedValue::Null | ParsedValue::NoValue => {
723 return visitor.visit_bytes(&[]);
724 }
725 _ => return self.deserialize_any(visitor),
726 };
727 match s {
728 Cow::Borrowed(s) => visitor.visit_borrowed_bytes(s),
729 Cow::Owned(s) => visitor.visit_byte_buf(s),
730 }
731 }
732
733 fn deserialize_byte_buf<V>(self, visitor: V) -> std::result::Result<V::Value, Self::Error>
734 where
735 V: de::Visitor<'de>,
736 {
737 self.deserialize_bytes(visitor)
738 }
739
740 fn deserialize_ignored_any<V>(self, visitor: V) -> std::result::Result<V::Value, Self::Error>
741 where
742 V: de::Visitor<'de>,
743 {
744 match self.value {
745 ParsedValue::String(cow) => match cow {
750 Cow::Borrowed(s) => visitor.visit_borrowed_bytes(s),
751 Cow::Owned(s) => visitor.visit_byte_buf(s),
752 },
753 _ => self.deserialize_any(visitor),
754 }
755 }
756
757 fn deserialize_bool<V>(self, visitor: V) -> std::result::Result<V::Value, Self::Error>
758 where
759 V: de::Visitor<'de>,
760 {
761 match self.value {
762 ParsedValue::String(s) => {
763 let deserializer = StringParsingDeserializer::new(s)?;
764 deserializer.deserialize_bool(visitor)
765 }
766 ParsedValue::Sequence(mut seq) => {
767 match get_last_string_value(&mut seq, self.config) {
768 Ok(Some(last_value)) => {
769 StringParsingDeserializer::new(last_value)?.deserialize_bool(visitor)
770 }
771 Ok(None) => {
772 Self::from_value(ParsedValue::Sequence(seq), self.config)
775 .deserialize_any(visitor)
776 }
777 Err(e) => Err(e),
778 }
779 }
780 ParsedValue::Null | ParsedValue::NoValue => visitor.visit_bool(true),
782 _ => self.deserialize_any(visitor),
783 }
784 }
785
786 forward_to_deserialize_any! {
787 char
788 identifier
789 }
790
791 forward_to_string_parser! {
792 u8 => deserialize_u8,
793 u16 => deserialize_u16,
794 u32 => deserialize_u32,
795 u64 => deserialize_u64,
796 i8 => deserialize_i8,
797 i16 => deserialize_i16,
798 i32 => deserialize_i32,
799 i64 => deserialize_i64,
800 f32 => deserialize_f32,
801 f64 => deserialize_f64,
802 }
803}