1use crate::producer::*;
4use crate::*;
5use serde::de;
6use serde::Deserialize;
7
8pub fn from_ref<'de, P, T>(p: P) -> Result<T>
11where
12 P: Into<DynProducerComplete<'de>>,
13 T: Deserialize<'de>,
14{
15 from_ref_config(p, &Config::default())
16}
17
18pub fn from_ref_config<'de, P, T>(p: P, config: &Config) -> Result<T>
21where
22 P: Into<DynProducerComplete<'de>>,
23 T: Deserialize<'de>,
24{
25 let mut deserializer = DeserializerSync::from_ref_config(p, config)?;
26 T::deserialize(&mut deserializer)
27}
28
29pub fn from_sync<'de, P, T>(p: P) -> Result<T>
32where
33 P: Into<DynProducerSync<'de>>,
34 T: de::DeserializeOwned,
35{
36 from_sync_config(p, &Config::default())
37}
38
39pub fn from_sync_config<'de, P, T>(p: P, config: &Config) -> Result<T>
42where
43 P: Into<DynProducerSync<'de>>,
44 T: de::DeserializeOwned,
45{
46 let mut deserializer = DeserializerSync::from_sync_config(p, config)?;
47 T::deserialize(&mut deserializer)
48}
49
50pub async fn from_async<'de, P, T>(p: P) -> Result<T>
53where
54 P: Into<DynProducerAsync<'de>>,
55 T: de::DeserializeOwned,
56{
57 from_async_config(p, &Config::default()).await
58}
59
60pub async fn from_async_config<'de, P, T>(p: P, config: &Config) -> Result<T>
63where
64 P: Into<DynProducerAsync<'de>>,
65 T: de::DeserializeOwned,
66{
67 let mut deserializer =
68 DeserializerSync::from_async_config(p, config).await?;
69 T::deserialize(&mut deserializer)
70}
71
72enum MetaValue<'lt> {
74 O(Value),
75 R(ValueRef<'lt>),
76}
77
78impl<'lt> fmt::Debug for MetaValue<'lt> {
79 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
80 match self {
81 MetaValue::O(Value::Nil) | MetaValue::R(ValueRef::Nil) => {
82 f.write_str("nil")
83 }
84 MetaValue::O(Value::Bool(b)) | MetaValue::R(ValueRef::Bool(b)) => {
85 write!(f, "bool({})", b)
86 }
87 MetaValue::O(Value::Num(n)) | MetaValue::R(ValueRef::Num(n)) => {
88 write!(f, "num({})", n)
89 }
90 MetaValue::O(Value::Bin(_)) | MetaValue::R(ValueRef::Bin(_)) => {
91 f.write_str("bin")
92 }
93 MetaValue::O(Value::Str(_)) | MetaValue::R(ValueRef::Str(_)) => {
94 f.write_str("str")
95 }
96 MetaValue::O(Value::Ext(t, _))
97 | MetaValue::R(ValueRef::Ext(t, _)) => {
98 write!(f, "ext({})", t)
99 }
100 MetaValue::O(Value::Arr(_)) | MetaValue::R(ValueRef::Arr(_)) => {
101 f.write_str("seq")
102 }
103 MetaValue::O(Value::Map(_)) | MetaValue::R(ValueRef::Map(_)) => {
104 f.write_str("map")
105 }
106 }
107 }
108}
109
110pub struct DeserializerSync<'de>(Option<MetaValue<'de>>);
112
113impl<'de> DeserializerSync<'de> {
114 pub fn from_ref_config<P: Into<DynProducerComplete<'de>>>(
117 p: P,
118 config: &Config,
119 ) -> Result<DeserializerSync<'de>> {
120 Ok(Self(Some(MetaValue::R(ValueRef::from_ref_config(
121 p, config,
122 )?))))
123 }
124
125 pub fn from_sync_config<'a, P: Into<DynProducerSync<'a>>>(
128 p: P,
129 config: &Config,
130 ) -> Result<DeserializerSync<'de>> {
131 Ok(Self(Some(MetaValue::O(Value::from_sync_config(
132 p, config,
133 )?))))
134 }
135
136 pub async fn from_async_config<'a, P: Into<DynProducerAsync<'a>>>(
139 p: P,
140 config: &Config,
141 ) -> Result<DeserializerSync<'de>> {
142 Ok(Self(Some(MetaValue::O(
143 Value::from_async_config(p, config).await?,
144 ))))
145 }
146}
147
148impl<'de, 'a> de::Deserializer<'de> for &'a mut DeserializerSync<'de> {
149 type Error = Error;
150
151 fn is_human_readable(&self) -> bool {
152 false
153 }
154
155 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
156 where
157 V: de::Visitor<'de>,
158 {
159 match &self.0 {
160 Some(MetaValue::O(Value::Nil))
161 | Some(MetaValue::R(ValueRef::Nil)) => {
162 self.deserialize_unit(visitor)
163 }
164 Some(MetaValue::O(Value::Bool(_)))
165 | Some(MetaValue::R(ValueRef::Bool(_))) => {
166 self.deserialize_bool(visitor)
167 }
168 Some(MetaValue::O(Value::Num(n)))
169 | Some(MetaValue::R(ValueRef::Num(n))) => match n {
170 Num::Unsigned(_) => self.deserialize_u64(visitor),
171 Num::Signed(_) => self.deserialize_i64(visitor),
172 Num::F32(_) => self.deserialize_f32(visitor),
173 Num::F64(_) => self.deserialize_f64(visitor),
174 },
175 Some(MetaValue::O(Value::Arr(_)))
176 | Some(MetaValue::R(ValueRef::Arr(_))) => {
177 self.deserialize_seq(visitor)
178 }
179 Some(MetaValue::O(Value::Map(_)))
180 | Some(MetaValue::R(ValueRef::Map(_))) => {
181 self.deserialize_map(visitor)
182 }
183 Some(MetaValue::O(Value::Str(_))) => {
184 self.deserialize_string(visitor)
185 }
186 Some(MetaValue::R(ValueRef::Str(_))) => {
187 self.deserialize_str(visitor)
188 }
189 Some(MetaValue::O(Value::Bin(_))) => {
190 self.deserialize_byte_buf(visitor)
191 }
192 Some(MetaValue::R(ValueRef::Bin(_))) => {
193 self.deserialize_bytes(visitor)
194 }
195 Some(MetaValue::O(Value::Ext(_, _)))
196 | Some(MetaValue::R(ValueRef::Ext(_, _))) => {
197 self.deserialize_newtype_struct(EXT_STRUCT_NAME, visitor)
198 }
199 None => Err(Error::EDecode {
200 expected: "any".into(),
201 got: "no data".into(),
202 }),
203 }
204 }
205
206 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
207 where
208 V: de::Visitor<'de>,
209 {
210 match self.0.take() {
211 Some(MetaValue::O(Value::Bool(b)))
212 | Some(MetaValue::R(ValueRef::Bool(b))) => visitor.visit_bool(b),
213 oth => Err(Error::EDecode {
214 expected: "bool".into(),
215 got: format!("{:?}", oth),
216 }),
217 }
218 }
219
220 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
221 where
222 V: de::Visitor<'de>,
223 {
224 match self.0.take() {
225 Some(MetaValue::O(Value::Num(n)))
226 | Some(MetaValue::R(ValueRef::Num(n)))
227 if n.fits::<i8>() =>
228 {
229 visitor.visit_i8(n.to())
230 }
231 oth => Err(Error::EDecode {
232 expected: "i8".into(),
233 got: format!("{:?}", oth),
234 }),
235 }
236 }
237
238 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
239 where
240 V: de::Visitor<'de>,
241 {
242 match self.0.take() {
243 Some(MetaValue::O(Value::Num(n)))
244 | Some(MetaValue::R(ValueRef::Num(n)))
245 if n.fits::<i16>() =>
246 {
247 visitor.visit_i16(n.to())
248 }
249 oth => Err(Error::EDecode {
250 expected: "i16".into(),
251 got: format!("{:?}", oth),
252 }),
253 }
254 }
255
256 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
257 where
258 V: de::Visitor<'de>,
259 {
260 match self.0.take() {
261 Some(MetaValue::O(Value::Num(n)))
262 | Some(MetaValue::R(ValueRef::Num(n)))
263 if n.fits::<i32>() =>
264 {
265 visitor.visit_i32(n.to())
266 }
267 oth => Err(Error::EDecode {
268 expected: "i32".into(),
269 got: format!("{:?}", oth),
270 }),
271 }
272 }
273
274 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
275 where
276 V: de::Visitor<'de>,
277 {
278 match self.0.take() {
279 Some(MetaValue::O(Value::Num(n)))
280 | Some(MetaValue::R(ValueRef::Num(n)))
281 if n.fits::<i64>() =>
282 {
283 visitor.visit_i64(n.to())
284 }
285 oth => Err(Error::EDecode {
286 expected: "i64".into(),
287 got: format!("{:?}", oth),
288 }),
289 }
290 }
291
292 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
293 where
294 V: de::Visitor<'de>,
295 {
296 match self.0.take() {
297 Some(MetaValue::O(Value::Num(n)))
298 | Some(MetaValue::R(ValueRef::Num(n)))
299 if n.fits::<u8>() =>
300 {
301 visitor.visit_u8(n.to())
302 }
303 oth => Err(Error::EDecode {
304 expected: "u8".into(),
305 got: format!("{:?}", oth),
306 }),
307 }
308 }
309
310 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
311 where
312 V: de::Visitor<'de>,
313 {
314 match self.0.take() {
315 Some(MetaValue::O(Value::Num(n)))
316 | Some(MetaValue::R(ValueRef::Num(n)))
317 if n.fits::<u16>() =>
318 {
319 visitor.visit_u16(n.to())
320 }
321 oth => Err(Error::EDecode {
322 expected: "u16".into(),
323 got: format!("{:?}", oth),
324 }),
325 }
326 }
327
328 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
329 where
330 V: de::Visitor<'de>,
331 {
332 match self.0.take() {
333 Some(MetaValue::O(Value::Num(n)))
334 | Some(MetaValue::R(ValueRef::Num(n)))
335 if n.fits::<u32>() =>
336 {
337 visitor.visit_u32(n.to())
338 }
339 oth => Err(Error::EDecode {
340 expected: "u32".into(),
341 got: format!("{:?}", oth),
342 }),
343 }
344 }
345
346 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
347 where
348 V: de::Visitor<'de>,
349 {
350 match self.0.take() {
351 Some(MetaValue::O(Value::Num(n)))
352 | Some(MetaValue::R(ValueRef::Num(n)))
353 if n.fits::<u64>() =>
354 {
355 visitor.visit_u64(n.to())
356 }
357 oth => Err(Error::EDecode {
358 expected: "u64".into(),
359 got: format!("{:?}", oth),
360 }),
361 }
362 }
363
364 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
365 where
366 V: de::Visitor<'de>,
367 {
368 match self.0.take() {
369 Some(MetaValue::O(Value::Num(n)))
370 | Some(MetaValue::R(ValueRef::Num(n)))
371 if n.fits::<f32>() =>
372 {
373 visitor.visit_f32(n.to())
374 }
375 oth => Err(Error::EDecode {
376 expected: "f32".into(),
377 got: format!("{:?}", oth),
378 }),
379 }
380 }
381
382 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
383 where
384 V: de::Visitor<'de>,
385 {
386 match self.0.take() {
387 Some(MetaValue::O(Value::Num(n)))
388 | Some(MetaValue::R(ValueRef::Num(n)))
389 if n.fits::<f64>() =>
390 {
391 visitor.visit_f64(n.to())
392 }
393 oth => Err(Error::EDecode {
394 expected: "f64".into(),
395 got: format!("{:?}", oth),
396 }),
397 }
398 }
399
400 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
401 where
402 V: de::Visitor<'de>,
403 {
404 match (|this: Self| {
405 let o = this.0.take();
406 let s = match &o {
407 Some(MetaValue::O(Value::Str(s))) => s.as_str(),
408 Some(MetaValue::R(ValueRef::Str(s))) => s.as_str(),
409 _ => return Err(o),
410 };
411 let s = match s {
412 Ok(s) => s,
413 Err(_) => return Err(o),
414 };
415 let mut iter = s.chars();
416 let c = match iter.next() {
418 Some(c) => c,
419 None => return Err(o),
420 };
421 match iter.next() {
423 None => Ok(c),
424 Some(_) => Err(o),
425 }
426 })(self)
427 {
428 Ok(c) => visitor.visit_char(c),
429 Err(o) => Err(Error::EDecode {
430 expected: "char".into(),
431 got: format!("{:?}", o),
432 }),
433 }
434 }
435
436 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
437 where
438 V: de::Visitor<'de>,
439 {
440 use crate::value::Utf8Str;
441 match self.0.take() {
442 Some(MetaValue::O(Value::Str(Utf8Str(data)))) => {
443 let data = Vec::from(data);
444 match String::from_utf8(data) {
445 Ok(s) => visitor.visit_string(s),
446 Err(e) => visitor.visit_byte_buf(e.into_bytes()),
447 }
448 }
449 Some(MetaValue::R(ValueRef::Str(s))) => match s.as_str() {
450 Ok(s) => visitor.visit_borrowed_str(s),
451 Err(_) => visitor.visit_borrowed_bytes(s.as_bytes()),
452 },
453 oth => Err(Error::EDecode {
454 expected: "str".into(),
455 got: format!("{:?}", oth),
456 }),
457 }
458 }
459
460 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
461 where
462 V: de::Visitor<'de>,
463 {
464 self.deserialize_str(visitor)
465 }
466
467 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
468 where
469 V: de::Visitor<'de>,
470 {
471 match self.0.take() {
472 Some(MetaValue::O(Value::Bin(data))) => {
473 visitor.visit_byte_buf(Vec::from(data))
474 }
475 Some(MetaValue::R(ValueRef::Bin(data))) => {
476 visitor.visit_borrowed_bytes(data)
477 }
478 oth => Err(Error::EDecode {
479 expected: "bin".into(),
480 got: format!("{:?}", oth),
481 }),
482 }
483 }
484
485 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
486 where
487 V: de::Visitor<'de>,
488 {
489 self.deserialize_bytes(visitor)
490 }
491
492 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
493 where
494 V: de::Visitor<'de>,
495 {
496 match &self.0 {
497 Some(MetaValue::O(Value::Nil))
498 | Some(MetaValue::R(ValueRef::Nil)) => visitor.visit_none(),
499 _ => visitor.visit_some(self),
500 }
501 }
502
503 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
504 where
505 V: de::Visitor<'de>,
506 {
507 match self.0.take() {
508 Some(MetaValue::O(Value::Nil))
509 | Some(MetaValue::R(ValueRef::Nil)) => visitor.visit_unit(),
510 oth => Err(Error::EDecode {
511 expected: "unit".into(),
512 got: format!("{:?}", oth),
513 }),
514 }
515 }
516
517 fn deserialize_unit_struct<V>(
518 self,
519 _name: &'static str,
520 visitor: V,
521 ) -> Result<V::Value>
522 where
523 V: de::Visitor<'de>,
524 {
525 self.deserialize_unit(visitor)
526 }
527
528 fn deserialize_newtype_struct<V>(
529 self,
530 name: &'static str,
531 visitor: V,
532 ) -> Result<V::Value>
533 where
534 V: de::Visitor<'de>,
535 {
536 if name == EXT_STRUCT_NAME {
537 match self.0.take() {
538 Some(MetaValue::O(Value::Ext(t, data))) => {
539 self.0.replace(MetaValue::O(Value::Arr(vec![
540 Value::Num(t.into()),
541 Value::Bin(data),
542 ])));
543 }
544 Some(MetaValue::R(ValueRef::Ext(t, data))) => {
545 self.0.replace(MetaValue::R(ValueRef::Arr(vec![
546 ValueRef::Num(t.into()),
547 ValueRef::Bin(data),
548 ])));
549 }
550 Some(oth) => {
551 self.0.replace(oth);
552 }
553 _ => (),
554 }
555 }
556
557 visitor.visit_newtype_struct(self)
558 }
559
560 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
561 where
562 V: de::Visitor<'de>,
563 {
564 match self.0.take() {
565 Some(MetaValue::O(Value::Arr(arr))) => {
566 visitor.visit_seq(Seq(arr.into_iter().map(MetaValue::O)))
567 }
568 Some(MetaValue::R(ValueRef::Arr(arr))) => {
569 visitor.visit_seq(Seq(arr.into_iter().map(MetaValue::R)))
570 }
571 oth => Err(Error::EDecode {
572 expected: "seq".into(),
573 got: format!("{:?}", oth),
574 }),
575 }
576 }
577
578 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
579 where
580 V: de::Visitor<'de>,
581 {
582 self.deserialize_seq(visitor)
583 }
584
585 fn deserialize_tuple_struct<V>(
586 self,
587 _name: &'static str,
588 _len: usize,
589 visitor: V,
590 ) -> Result<V::Value>
591 where
592 V: de::Visitor<'de>,
593 {
594 self.deserialize_seq(visitor)
595 }
596
597 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
598 where
599 V: de::Visitor<'de>,
600 {
601 match self.0.take() {
604 Some(MetaValue::O(Value::Map(map))) => visitor.visit_map(Seq(map
605 .into_iter()
606 .flat_map(|(k, v)| [MetaValue::O(k), MetaValue::O(v)]))),
607 Some(MetaValue::R(ValueRef::Map(map))) => visitor
608 .visit_map(Seq(map
609 .into_iter()
610 .flat_map(|(k, v)| [MetaValue::R(k), MetaValue::R(v)]))),
611 oth => Err(Error::EDecode {
612 expected: "map".into(),
613 got: format!("{:?}", oth),
614 }),
615 }
616 }
617
618 fn deserialize_struct<V>(
619 self,
620 _name: &'static str,
621 _fields: &'static [&'static str],
622 visitor: V,
623 ) -> Result<V::Value>
624 where
625 V: de::Visitor<'de>,
626 {
627 self.deserialize_map(visitor)
628 }
629
630 fn deserialize_enum<V>(
631 self,
632 _name: &'static str,
633 _variants: &'static [&'static str],
634 visitor: V,
635 ) -> Result<V::Value>
636 where
637 V: de::Visitor<'de>,
638 {
639 use de::IntoDeserializer;
640 match self.0.take() {
641 Some(MetaValue::O(Value::Str(s))) => match s.as_str() {
642 Ok(s) => visitor.visit_enum(s.into_deserializer()),
643 Err(_) => Err(Error::EDecode {
644 expected: "utf8 str".into(),
645 got: "non-utf8 bytes".into(),
646 }),
647 },
648 Some(MetaValue::R(ValueRef::Str(s))) => match s.as_str() {
649 Ok(s) => visitor.visit_enum(s.into_deserializer()),
650 Err(_) => Err(Error::EDecode {
651 expected: "utf8 str".into(),
652 got: "non-utf8 bytes".into(),
653 }),
654 },
655 Some(MetaValue::O(Value::Map(mut map))) if map.len() == 1 => {
656 let (k, v) = map.remove(0);
657 visitor.visit_enum(Enum(
658 Some(MetaValue::O(k)),
659 Some(MetaValue::O(v)),
660 ))
661 }
662 Some(MetaValue::R(ValueRef::Map(mut map))) if map.len() == 1 => {
663 let (k, v) = map.remove(0);
664 visitor.visit_enum(Enum(
665 Some(MetaValue::R(k)),
666 Some(MetaValue::R(v)),
667 ))
668 }
669 oth => Err(Error::EDecode {
670 expected: "str or map(len == 1)".into(),
671 got: format!("{:?}", oth),
672 }),
673 }
674 }
675
676 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
677 where
678 V: de::Visitor<'de>,
679 {
680 self.deserialize_str(visitor)
681 }
682
683 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
684 where
685 V: de::Visitor<'de>,
686 {
687 self.deserialize_any(visitor)
688 }
689}
690
691struct Seq<'de, I: Iterator<Item = MetaValue<'de>>>(I);
692
693impl<'de, I: Iterator<Item = MetaValue<'de>>> de::SeqAccess<'de>
694 for Seq<'de, I>
695{
696 type Error = Error;
697
698 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
699 where
700 T: de::DeserializeSeed<'de>,
701 {
702 match self.0.next() {
703 None => Ok(None),
704 Some(v) => {
705 let mut d = DeserializerSync(Some(v));
706 seed.deserialize(&mut d).map(Some)
707 }
708 }
709 }
710}
711
712impl<'de, I: Iterator<Item = MetaValue<'de>>> de::MapAccess<'de>
714 for Seq<'de, I>
715{
716 type Error = Error;
717
718 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
719 where
720 K: de::DeserializeSeed<'de>,
721 {
722 de::SeqAccess::next_element_seed(self, seed)
723 }
724
725 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
726 where
727 V: de::DeserializeSeed<'de>,
728 {
729 match de::SeqAccess::next_element_seed(self, seed)? {
730 Some(v) => Ok(v),
731 None => Err("expected value".into()),
732 }
733 }
734}
735
736struct Enum<'de>(Option<MetaValue<'de>>, Option<MetaValue<'de>>);
737
738impl<'de> de::EnumAccess<'de> for Enum<'de> {
739 type Error = Error;
740 type Variant = Self;
741
742 fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant)>
743 where
744 V: de::DeserializeSeed<'de>,
745 {
746 let key = seed.deserialize(&mut DeserializerSync(self.0.take()))?;
747 Ok((key, self))
748 }
749}
750
751impl<'de> de::VariantAccess<'de> for Enum<'de> {
752 type Error = Error;
753
754 fn unit_variant(self) -> Result<()> {
755 Ok(())
757 }
758
759 fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value>
760 where
761 T: de::DeserializeSeed<'de>,
762 {
763 seed.deserialize(&mut DeserializerSync(self.1.take()))
764 }
765
766 fn tuple_variant<V>(mut self, _len: usize, visitor: V) -> Result<V::Value>
767 where
768 V: de::Visitor<'de>,
769 {
770 de::Deserializer::deserialize_seq(
771 &mut DeserializerSync(self.1.take()),
772 visitor,
773 )
774 }
775
776 fn struct_variant<V>(
777 mut self,
778 _fields: &'static [&'static str],
779 visitor: V,
780 ) -> Result<V::Value>
781 where
782 V: de::Visitor<'de>,
783 {
784 de::Deserializer::deserialize_map(
785 &mut DeserializerSync(self.1.take()),
786 visitor,
787 )
788 }
789}