1extern crate alloc;
2
3use alloc::borrow::Cow;
4use alloc::format;
5
6use facet_core::{Def, Facet, NumericType, PrimitiveType, Shape, StructKind, Type, UserType};
7pub use facet_path::{Path, PathStep};
8use facet_reflect::{HeapValue, Partial, is_spanned_shape};
9
10use crate::{ContainerKind, FormatParser, ParseEvent, ScalarTypeHint, ScalarValue};
11
12mod error;
13pub use error::*;
14
15mod dynamic;
16mod eenum;
17mod pointer;
18mod scalar_matches;
19mod setters;
20mod struct_simple;
21mod struct_with_flatten;
22mod validate;
23
24pub struct FormatDeserializer<'input, const BORROW: bool, P> {
30 parser: P,
31 last_span: Option<facet_reflect::Span>,
33 current_path: Path,
35 _marker: core::marker::PhantomData<&'input ()>,
36}
37
38impl<'input, P> FormatDeserializer<'input, true, P> {
39 pub const fn new(parser: P) -> Self {
41 Self {
42 parser,
43 last_span: None,
44 current_path: Path::new(),
45 _marker: core::marker::PhantomData,
46 }
47 }
48}
49
50impl<'input, P> FormatDeserializer<'input, false, P> {
51 pub const fn new_owned(parser: P) -> Self {
53 Self {
54 parser,
55 last_span: None,
56 current_path: Path::new(),
57 _marker: core::marker::PhantomData,
58 }
59 }
60}
61
62impl<'input, const BORROW: bool, P> FormatDeserializer<'input, BORROW, P> {
63 pub fn into_inner(self) -> P {
65 self.parser
66 }
67
68 pub const fn parser_mut(&mut self) -> &mut P {
70 &mut self.parser
71 }
72}
73
74impl<'input, P> FormatDeserializer<'input, true, P>
75where
76 P: FormatParser<'input>,
77{
78 pub fn deserialize<T>(&mut self) -> Result<T, DeserializeError<P::Error>>
80 where
81 T: Facet<'input>,
82 {
83 let wip: Partial<'input, true> =
84 Partial::alloc::<T>().map_err(DeserializeError::reflect)?;
85 let partial = self.deserialize_into(wip)?;
86 let heap_value: HeapValue<'input, true> =
87 partial.build().map_err(DeserializeError::reflect)?;
88 heap_value
89 .materialize::<T>()
90 .map_err(DeserializeError::reflect)
91 }
92
93 pub fn deserialize_root<T>(&mut self) -> Result<T, DeserializeError<P::Error>>
95 where
96 T: Facet<'input>,
97 {
98 self.deserialize()
99 }
100
101 pub fn deserialize_deferred<T>(&mut self) -> Result<T, DeserializeError<P::Error>>
107 where
108 T: Facet<'input>,
109 {
110 let wip: Partial<'input, true> =
111 Partial::alloc::<T>().map_err(DeserializeError::reflect)?;
112 let wip = wip.begin_deferred().map_err(DeserializeError::reflect)?;
113 let partial = self.deserialize_into(wip)?;
114 let partial = partial
115 .finish_deferred()
116 .map_err(DeserializeError::reflect)?;
117 let heap_value: HeapValue<'input, true> =
118 partial.build().map_err(DeserializeError::reflect)?;
119 heap_value
120 .materialize::<T>()
121 .map_err(DeserializeError::reflect)
122 }
123}
124
125impl<'input, P> FormatDeserializer<'input, false, P>
126where
127 P: FormatParser<'input>,
128{
129 pub fn deserialize<T>(&mut self) -> Result<T, DeserializeError<P::Error>>
131 where
132 T: Facet<'static>,
133 {
134 #[allow(unsafe_code)]
138 let wip: Partial<'input, false> = unsafe {
139 core::mem::transmute::<Partial<'static, false>, Partial<'input, false>>(
140 Partial::alloc_owned::<T>().map_err(DeserializeError::reflect)?,
141 )
142 };
143 let partial = self.deserialize_into(wip)?;
144 let heap_value: HeapValue<'input, false> =
145 partial.build().map_err(DeserializeError::reflect)?;
146
147 #[allow(unsafe_code)]
150 let heap_value: HeapValue<'static, false> = unsafe {
151 core::mem::transmute::<HeapValue<'input, false>, HeapValue<'static, false>>(heap_value)
152 };
153
154 heap_value
155 .materialize::<T>()
156 .map_err(DeserializeError::reflect)
157 }
158
159 pub fn deserialize_root<T>(&mut self) -> Result<T, DeserializeError<P::Error>>
161 where
162 T: Facet<'static>,
163 {
164 self.deserialize()
165 }
166
167 pub fn deserialize_deferred<T>(&mut self) -> Result<T, DeserializeError<P::Error>>
173 where
174 T: Facet<'static>,
175 {
176 #[allow(unsafe_code)]
180 let wip: Partial<'input, false> = unsafe {
181 core::mem::transmute::<Partial<'static, false>, Partial<'input, false>>(
182 Partial::alloc_owned::<T>().map_err(DeserializeError::reflect)?,
183 )
184 };
185 let wip = wip.begin_deferred().map_err(DeserializeError::reflect)?;
186 let partial = self.deserialize_into(wip)?;
187 let partial = partial
188 .finish_deferred()
189 .map_err(DeserializeError::reflect)?;
190 let heap_value: HeapValue<'input, false> =
191 partial.build().map_err(DeserializeError::reflect)?;
192
193 #[allow(unsafe_code)]
196 let heap_value: HeapValue<'static, false> = unsafe {
197 core::mem::transmute::<HeapValue<'input, false>, HeapValue<'static, false>>(heap_value)
198 };
199
200 heap_value
201 .materialize::<T>()
202 .map_err(DeserializeError::reflect)
203 }
204
205 pub fn deserialize_with_shape<T>(
213 &mut self,
214 source_shape: &'static Shape,
215 ) -> Result<T, DeserializeError<P::Error>>
216 where
217 T: Facet<'static>,
218 {
219 #[allow(unsafe_code)]
220 let wip: Partial<'input, false> = unsafe {
221 core::mem::transmute::<Partial<'static, false>, Partial<'input, false>>(
222 Partial::alloc_owned::<T>().map_err(DeserializeError::reflect)?,
223 )
224 };
225 let partial = self.deserialize_into_with_shape(wip, source_shape)?;
226 let heap_value: HeapValue<'input, false> =
227 partial.build().map_err(DeserializeError::reflect)?;
228
229 #[allow(unsafe_code)]
230 let heap_value: HeapValue<'static, false> = unsafe {
231 core::mem::transmute::<HeapValue<'input, false>, HeapValue<'static, false>>(heap_value)
232 };
233
234 heap_value
235 .materialize::<T>()
236 .map_err(DeserializeError::reflect)
237 }
238}
239
240impl<'input, const BORROW: bool, P> FormatDeserializer<'input, BORROW, P>
241where
242 P: FormatParser<'input>,
243{
244 #[inline]
246 fn expect_event(
247 &mut self,
248 expected: &'static str,
249 ) -> Result<ParseEvent<'input>, DeserializeError<P::Error>> {
250 let event = self
251 .parser
252 .next_event()
253 .map_err(DeserializeError::Parser)?
254 .ok_or(DeserializeError::UnexpectedEof { expected })?;
255 trace!(?event, expected, "expect_event: got event");
256 self.last_span = self.parser.current_span();
258 Ok(event)
259 }
260
261 #[inline]
263 fn expect_peek(
264 &mut self,
265 expected: &'static str,
266 ) -> Result<ParseEvent<'input>, DeserializeError<P::Error>> {
267 let event = self
268 .parser
269 .peek_event()
270 .map_err(DeserializeError::Parser)?
271 .ok_or(DeserializeError::UnexpectedEof { expected })?;
272 trace!(?event, expected, "expect_peek: peeked event");
273 Ok(event)
274 }
275
276 #[inline]
278 fn push_path(&mut self, step: PathStep) {
279 self.current_path.push(step);
280 }
281
282 #[inline]
284 fn pop_path(&mut self) {
285 self.current_path.pop();
286 }
287
288 #[inline]
290 fn path_clone(&self) -> Path {
291 self.current_path.clone()
292 }
293
294 pub fn deserialize_into(
296 &mut self,
297 mut wip: Partial<'input, BORROW>,
298 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
299 let shape = wip.shape();
300 trace!(
301 shape_name = shape.type_identifier,
302 "deserialize_into: starting"
303 );
304
305 if self.parser.raw_capture_shape() == Some(shape)
310 && let Some(raw) = self
311 .parser
312 .capture_raw()
313 .map_err(DeserializeError::Parser)?
314 {
315 wip = wip.begin_nth_field(0).map_err(DeserializeError::reflect)?;
318 wip = self.set_string_value(wip, Cow::Borrowed(raw))?;
319 wip = wip.end().map_err(DeserializeError::reflect)?;
320 return Ok(wip);
321 }
322
323 let format_ns = self.parser.format_namespace();
325 let (wip_returned, has_proxy) = wip
326 .begin_custom_deserialization_from_shape_with_format(format_ns)
327 .map_err(DeserializeError::reflect)?;
328 wip = wip_returned;
329 if has_proxy {
330 wip = self.deserialize_into(wip)?;
331 return wip.end().map_err(DeserializeError::reflect);
332 }
333
334 if wip
337 .parent_field()
338 .and_then(|field| field.effective_proxy(format_ns))
339 .is_some()
340 {
341 wip = wip
342 .begin_custom_deserialization_with_format(format_ns)
343 .map_err(DeserializeError::reflect)?;
344 wip = self.deserialize_into(wip)?;
345 wip = wip.end().map_err(DeserializeError::reflect)?;
346 return Ok(wip);
347 }
348
349 if matches!(&shape.def, Def::Option(_)) {
351 return self.deserialize_option(wip);
352 }
353
354 if matches!(&shape.def, Def::Result(_)) {
356 return self.deserialize_result_as_enum(wip);
357 }
358
359 if shape.builder_shape.is_some() {
361 wip = wip.begin_inner().map_err(DeserializeError::reflect)?;
362 wip = self.deserialize_into(wip)?;
363 wip = wip.end().map_err(DeserializeError::reflect)?;
364 return Ok(wip);
365 }
366
367 if matches!(&shape.def, Def::Pointer(_)) {
369 return self.deserialize_pointer(wip);
370 }
371
372 let is_opaque_scalar =
377 matches!(shape.def, Def::Scalar) && matches!(shape.ty, Type::User(UserType::Opaque));
378 if shape.inner.is_some()
379 && !is_opaque_scalar
380 && !matches!(
381 &shape.def,
382 Def::List(_) | Def::Map(_) | Def::Set(_) | Def::Array(_)
383 )
384 {
385 wip = wip.begin_inner().map_err(DeserializeError::reflect)?;
386 wip = self.deserialize_into(wip)?;
387 wip = wip.end().map_err(DeserializeError::reflect)?;
388 return Ok(wip);
389 }
390
391 if is_spanned_shape(shape) {
393 return self.deserialize_spanned(wip);
394 }
395
396 if shape.is_metadata_container() {
399 trace!("deserialize_into: metadata container detected, deserializing transparently");
400 if let Type::User(UserType::Struct(st)) = &shape.ty {
401 for field in st.fields {
402 if field.metadata_kind().is_none() {
403 wip = wip
405 .begin_field(field.effective_name())
406 .map_err(DeserializeError::reflect)?;
407 wip = self.deserialize_into(wip)?;
408 wip = wip.end().map_err(DeserializeError::reflect)?;
409 }
410 }
412 }
413 return Ok(wip);
414 }
415
416 match &shape.ty {
418 Type::User(UserType::Struct(struct_def)) => {
419 if matches!(struct_def.kind, StructKind::Tuple | StructKind::TupleStruct) {
420 trace!("deserialize_into: dispatching to deserialize_tuple");
421 return self.deserialize_tuple(wip);
422 }
423 trace!("deserialize_into: dispatching to deserialize_struct");
424 return self.deserialize_struct(wip);
425 }
426 Type::User(UserType::Enum(_)) => {
427 trace!("deserialize_into: dispatching to deserialize_enum");
428 return self.deserialize_enum(wip);
429 }
430 _ => {}
431 }
432
433 match &shape.def {
435 Def::Scalar => {
436 trace!("deserialize_into: dispatching to deserialize_scalar");
437 self.deserialize_scalar(wip)
438 }
439 Def::List(_) => {
440 trace!("deserialize_into: dispatching to deserialize_list");
441 self.deserialize_list(wip)
442 }
443 Def::Map(_) => {
444 trace!("deserialize_into: dispatching to deserialize_map");
445 self.deserialize_map(wip)
446 }
447 Def::Array(_) => {
448 trace!("deserialize_into: dispatching to deserialize_array");
449 self.deserialize_array(wip)
450 }
451 Def::Set(_) => {
452 trace!("deserialize_into: dispatching to deserialize_set");
453 self.deserialize_set(wip)
454 }
455 Def::DynamicValue(_) => {
456 trace!("deserialize_into: dispatching to deserialize_dynamic_value");
457 self.deserialize_dynamic_value(wip)
458 }
459 _ => Err(DeserializeError::Unsupported(format!(
460 "unsupported shape def: {:?}",
461 shape.def
462 ))),
463 }
464 }
465
466 pub fn deserialize_into_with_shape(
471 &mut self,
472 wip: Partial<'input, BORROW>,
473 hint_shape: &'static Shape,
474 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
475 self.deserialize_value_recursive(wip, hint_shape)
476 }
477
478 fn deserialize_value_recursive(
480 &mut self,
481 mut wip: Partial<'input, BORROW>,
482 hint_shape: &'static Shape,
483 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
484 if let Def::Option(opt_def) = &hint_shape.def {
486 self.parser.hint_option();
487 let event = self.expect_peek("value for option")?;
488 if matches!(
491 event,
492 ParseEvent::Scalar(ScalarValue::Null | ScalarValue::Unit)
493 ) {
494 let _ = self.expect_event("null or unit")?;
495 wip = wip.set_default().map_err(DeserializeError::reflect)?;
496 } else {
497 wip = self.deserialize_value_recursive(wip, opt_def.t)?;
498 }
499 return Ok(wip);
500 }
501
502 if let Def::Pointer(ptr_def) = &hint_shape.def
504 && let Some(pointee) = ptr_def.pointee()
505 {
506 return self.deserialize_value_recursive(wip, pointee);
507 }
508
509 if let Some(inner) = hint_shape.inner
511 && !matches!(
512 &hint_shape.def,
513 Def::List(_) | Def::Map(_) | Def::Set(_) | Def::Array(_)
514 )
515 {
516 return self.deserialize_value_recursive(wip, inner);
517 }
518
519 match &hint_shape.ty {
521 Type::User(UserType::Struct(struct_def)) => {
522 if matches!(struct_def.kind, StructKind::Tuple | StructKind::TupleStruct) {
523 self.deserialize_tuple_dynamic(wip, struct_def.fields)
524 } else {
525 self.deserialize_struct_dynamic(wip, struct_def.fields)
526 }
527 }
528 Type::User(UserType::Enum(enum_def)) => self.deserialize_enum_dynamic(wip, enum_def),
529 _ => match &hint_shape.def {
530 Def::Scalar => self.deserialize_scalar_dynamic(wip, hint_shape),
531 Def::List(list_def) => self.deserialize_list_dynamic(wip, list_def.t),
532 Def::Array(array_def) => {
533 self.deserialize_array_dynamic(wip, array_def.t, array_def.n)
534 }
535 Def::Map(map_def) => self.deserialize_map_dynamic(wip, map_def.k, map_def.v),
536 Def::Set(set_def) => self.deserialize_list_dynamic(wip, set_def.t),
537 _ => Err(DeserializeError::Unsupported(format!(
538 "unsupported hint shape for dynamic deserialization: {:?}",
539 hint_shape.def
540 ))),
541 },
542 }
543 }
544
545 fn deserialize_option(
546 &mut self,
547 mut wip: Partial<'input, BORROW>,
548 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
549 self.parser.hint_option();
551
552 let event = self.expect_peek("value for option")?;
553
554 if matches!(
557 event,
558 ParseEvent::Scalar(ScalarValue::Null | ScalarValue::Unit)
559 ) {
560 let _ = self.expect_event("null or unit")?;
562 wip = wip.set_default().map_err(DeserializeError::reflect)?;
564 } else {
565 wip = wip.begin_some().map_err(DeserializeError::reflect)?;
567 wip = self.deserialize_into(wip)?;
568 wip = wip.end().map_err(DeserializeError::reflect)?;
569 }
570 Ok(wip)
571 }
572
573 fn field_matches(field: &facet_core::Field, name: &str) -> bool {
575 field.effective_name() == name || field.alias.iter().any(|alias| *alias == name)
576 }
577
578 fn get_variant_display_name(variant: &facet_core::Variant) -> &'static str {
580 variant.effective_name()
581 }
582
583 fn find_variant_by_display_name<'a>(
586 enum_def: &'a facet_core::EnumType,
587 display_name: &str,
588 ) -> Option<&'a str> {
589 enum_def.variants.iter().find_map(|v| {
590 if v.effective_name() == display_name {
591 Some(v.effective_name())
592 } else {
593 None
594 }
595 })
596 }
597
598 fn deserialize_struct(
599 &mut self,
600 wip: Partial<'input, BORROW>,
601 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
602 let struct_def = match &wip.shape().ty {
604 Type::User(UserType::Struct(def)) => def,
605 _ => {
606 return Err(DeserializeError::Unsupported(format!(
607 "expected struct type but got {:?}",
608 wip.shape().ty
609 )));
610 }
611 };
612
613 let has_flatten = struct_def.fields.iter().any(|f| f.is_flattened());
615
616 if has_flatten {
617 self.deserialize_struct_with_flatten(wip)
618 } else {
619 self.deserialize_struct_simple(wip)
620 }
621 }
622
623 fn deserialize_spanned(
632 &mut self,
633 mut wip: Partial<'input, BORROW>,
634 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
635 let shape = wip.shape();
636
637 let Type::User(UserType::Struct(struct_def)) = &shape.ty else {
639 return Err(DeserializeError::Unsupported(format!(
640 "expected struct with span metadata, found {}",
641 shape.type_identifier
642 )));
643 };
644
645 let span_field = struct_def
646 .fields
647 .iter()
648 .find(|f| f.metadata_kind() == Some("span"))
649 .ok_or_else(|| {
650 DeserializeError::Unsupported(format!(
651 "expected struct with span metadata field, found {}",
652 shape.type_identifier
653 ))
654 })?;
655
656 let value_fields: alloc::vec::Vec<_> = struct_def
657 .fields
658 .iter()
659 .filter(|f| !f.is_metadata())
660 .collect();
661
662 for field in value_fields {
665 wip = wip
666 .begin_field(field.name)
667 .map_err(DeserializeError::reflect)?;
668 wip = self.deserialize_into(wip)?;
669 wip = wip.end().map_err(DeserializeError::reflect)?;
670 }
671
672 wip = wip
675 .begin_field(span_field.name)
676 .map_err(DeserializeError::reflect)?;
677 wip = wip.set_default().map_err(DeserializeError::reflect)?;
678 wip = wip.end().map_err(DeserializeError::reflect)?;
679
680 Ok(wip)
681 }
682
683 fn deserialize_tuple(
684 &mut self,
685 mut wip: Partial<'input, BORROW>,
686 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
687 let field_count = match &wip.shape().ty {
689 Type::User(UserType::Struct(def)) => def.fields.len(),
690 _ => 0, };
692
693 self.parser.hint_struct_fields(field_count);
696
697 if field_count == 1 && wip.shape().is_transparent() {
705 wip = wip.begin_field("0").map_err(DeserializeError::reflect)?;
707 wip = self.deserialize_into(wip)?;
708 wip = wip.end().map_err(DeserializeError::reflect)?;
709 return Ok(wip);
710 }
711
712 if field_count == 0 && matches!(self.expect_peek("value")?, ParseEvent::Scalar(ScalarValue::Unit)) {
715 self.expect_event("value")?; return Ok(wip);
717 }
718
719 let event = self.expect_event("value")?;
720
721 let struct_mode = match event {
724 ParseEvent::SequenceStart(_) => false,
725 ParseEvent::StructStart(_) if !self.parser.is_self_describing() => true,
728 ParseEvent::StructStart(ContainerKind::Object) => true,
731 ParseEvent::StructStart(kind) => {
732 return Err(DeserializeError::TypeMismatch {
733 expected: "array",
734 got: kind.name().into(),
735 span: self.last_span,
736 path: None,
737 });
738 }
739 _ => {
740 return Err(DeserializeError::TypeMismatch {
741 expected: "sequence start for tuple",
742 got: format!("{event:?}"),
743 span: self.last_span,
744 path: None,
745 });
746 }
747 };
748
749 let mut index = 0usize;
750 loop {
751 let event = self.expect_peek("value")?;
752
753 if matches!(event, ParseEvent::SequenceEnd | ParseEvent::StructEnd) {
755 self.expect_event("value")?;
756 break;
757 }
758
759 if struct_mode && matches!(event, ParseEvent::FieldKey(_)) {
761 self.expect_event("value")?;
762 continue;
763 }
764
765 let field_name = alloc::string::ToString::to_string(&index);
767 wip = wip
768 .begin_field(&field_name)
769 .map_err(DeserializeError::reflect)?;
770 wip = self.deserialize_into(wip)?;
771 wip = wip.end().map_err(DeserializeError::reflect)?;
772 index += 1;
773 }
774
775 Ok(wip)
776 }
777
778 fn find_tag_value<'a>(
780 evidence: &'a [crate::FieldEvidence<'input>],
781 tag_key: &str,
782 ) -> Option<&'a str> {
783 evidence
784 .iter()
785 .find(|e| e.name == tag_key)
786 .and_then(|e| match &e.scalar_value {
787 Some(ScalarValue::Str(s)) => Some(s.as_ref()),
788 _ => None,
789 })
790 }
791
792 fn collect_evidence<S: crate::ProbeStream<'input, Error = P::Error>>(
794 mut probe: S,
795 ) -> Result<alloc::vec::Vec<crate::FieldEvidence<'input>>, P::Error> {
796 let mut evidence = alloc::vec::Vec::new();
797 while let Some(ev) = probe.next()? {
798 evidence.push(ev);
799 }
800 Ok(evidence)
801 }
802
803 fn deserialize_list(
804 &mut self,
805 mut wip: Partial<'input, BORROW>,
806 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
807 trace!("deserialize_list: starting");
808
809 let is_byte_vec = wip.shape().type_identifier == "Vec"
813 && matches!(
814 &wip.shape().def,
815 Def::List(list_def) if list_def.t.type_identifier == "u8"
816 );
817
818 if is_byte_vec && self.parser.hint_byte_sequence() {
819 let event = self.expect_event("bytes")?;
821 trace!(?event, "deserialize_list: got bytes event");
822
823 return match event {
824 ParseEvent::Scalar(ScalarValue::Bytes(bytes)) => self.set_bytes_value(wip, bytes),
825 _ => Err(DeserializeError::TypeMismatch {
826 expected: "bytes",
827 got: format!("{event:?}"),
828 span: self.last_span,
829 path: None,
830 }),
831 };
832 }
833
834 self.parser.hint_sequence();
837
838 let event = self.expect_event("value")?;
839 trace!(?event, "deserialize_list: got container start event");
840
841 match event {
843 ParseEvent::SequenceStart(_) => {
844 trace!("deserialize_list: got sequence start");
845 }
846 ParseEvent::StructStart(kind) => {
847 return Err(DeserializeError::TypeMismatch {
848 expected: "array",
849 got: kind.name().into(),
850 span: self.last_span,
851 path: None,
852 });
853 }
854 _ => {
855 return Err(DeserializeError::TypeMismatch {
856 expected: "sequence start",
857 got: format!("{event:?}"),
858 span: self.last_span,
859 path: None,
860 });
861 }
862 };
863
864 wip = wip.init_list().map_err(DeserializeError::reflect)?;
866 trace!("deserialize_list: initialized list, starting loop");
867
868 loop {
869 let event = self.expect_peek("value")?;
870 trace!(?event, "deserialize_list: loop iteration");
871
872 if matches!(event, ParseEvent::SequenceEnd) {
874 self.expect_event("value")?;
875 trace!("deserialize_list: reached end of sequence");
876 break;
877 }
878
879 trace!("deserialize_list: deserializing list item");
880 wip = wip.begin_list_item().map_err(DeserializeError::reflect)?;
881 wip = self.deserialize_into(wip)?;
882 wip = wip.end().map_err(DeserializeError::reflect)?;
883 }
884
885 trace!("deserialize_list: completed");
886 Ok(wip)
887 }
888
889 fn deserialize_array(
890 &mut self,
891 mut wip: Partial<'input, BORROW>,
892 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
893 let array_len = match &wip.shape().def {
895 Def::Array(array_def) => array_def.n,
896 _ => {
897 return Err(DeserializeError::Unsupported(
898 "deserialize_array called on non-array type".into(),
899 ));
900 }
901 };
902
903 self.parser.hint_array(array_len);
906
907 let event = self.expect_event("value")?;
908
909 match event {
911 ParseEvent::SequenceStart(_) => {}
912 ParseEvent::StructStart(kind) => {
913 return Err(DeserializeError::TypeMismatch {
914 expected: "array",
915 got: kind.name().into(),
916 span: self.last_span,
917 path: None,
918 });
919 }
920 _ => {
921 return Err(DeserializeError::TypeMismatch {
922 expected: "sequence start for array",
923 got: format!("{event:?}"),
924 span: self.last_span,
925 path: None,
926 });
927 }
928 };
929
930 wip = wip.init_array().map_err(DeserializeError::reflect)?;
934
935 let mut index = 0usize;
936 loop {
937 let event = self.expect_peek("value")?;
938
939 if matches!(event, ParseEvent::SequenceEnd) {
941 self.expect_event("value")?;
942 break;
943 }
944
945 wip = wip
946 .begin_nth_field(index)
947 .map_err(DeserializeError::reflect)?;
948 wip = self.deserialize_into(wip)?;
949 wip = wip.end().map_err(DeserializeError::reflect)?;
950 index += 1;
951 }
952
953 Ok(wip)
954 }
955
956 fn deserialize_set(
957 &mut self,
958 mut wip: Partial<'input, BORROW>,
959 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
960 self.parser.hint_sequence();
962
963 let event = self.expect_event("value")?;
964
965 match event {
967 ParseEvent::SequenceStart(_) => {}
968 ParseEvent::StructStart(kind) => {
969 return Err(DeserializeError::TypeMismatch {
970 expected: "set",
971 got: kind.name().into(),
972 span: self.last_span,
973 path: None,
974 });
975 }
976 _ => {
977 return Err(DeserializeError::TypeMismatch {
978 expected: "sequence start for set",
979 got: format!("{event:?}"),
980 span: self.last_span,
981 path: None,
982 });
983 }
984 };
985
986 wip = wip.init_set().map_err(DeserializeError::reflect)?;
988
989 loop {
990 let event = self.expect_peek("value")?;
991
992 if matches!(event, ParseEvent::SequenceEnd) {
994 self.expect_event("value")?;
995 break;
996 }
997
998 wip = wip.begin_set_item().map_err(DeserializeError::reflect)?;
999 wip = self.deserialize_into(wip)?;
1000 wip = wip.end().map_err(DeserializeError::reflect)?;
1001 }
1002
1003 Ok(wip)
1004 }
1005
1006 fn deserialize_map(
1007 &mut self,
1008 mut wip: Partial<'input, BORROW>,
1009 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
1010 self.parser.hint_map();
1012
1013 let event = self.expect_event("value")?;
1014
1015 wip = wip.init_map().map_err(DeserializeError::reflect)?;
1017
1018 match event {
1020 ParseEvent::StructStart(_) => {
1021 loop {
1023 let event = self.expect_event("value")?;
1024 match event {
1025 ParseEvent::StructEnd => break,
1026 ParseEvent::FieldKey(key) => {
1027 wip = wip.begin_key().map_err(DeserializeError::reflect)?;
1029 wip = self.deserialize_map_key(wip, key.name, key.doc, key.tag)?;
1030 wip = wip.end().map_err(DeserializeError::reflect)?;
1031
1032 wip = wip.begin_value().map_err(DeserializeError::reflect)?;
1034 wip = self.deserialize_into(wip)?;
1035 wip = wip.end().map_err(DeserializeError::reflect)?;
1036 }
1037 other => {
1038 return Err(DeserializeError::TypeMismatch {
1039 expected: "field key or struct end for map",
1040 got: format!("{other:?}"),
1041 span: self.last_span,
1042 path: None,
1043 });
1044 }
1045 }
1046 }
1047 }
1048 ParseEvent::SequenceStart(_) => {
1049 loop {
1051 let event = self.expect_peek("value")?;
1052 match event {
1053 ParseEvent::SequenceEnd => {
1054 self.expect_event("value")?;
1055 break;
1056 }
1057 ParseEvent::OrderedField => {
1058 self.expect_event("value")?;
1059
1060 wip = wip.begin_key().map_err(DeserializeError::reflect)?;
1062 wip = self.deserialize_into(wip)?;
1063 wip = wip.end().map_err(DeserializeError::reflect)?;
1064
1065 wip = wip.begin_value().map_err(DeserializeError::reflect)?;
1067 wip = self.deserialize_into(wip)?;
1068 wip = wip.end().map_err(DeserializeError::reflect)?;
1069 }
1070 other => {
1071 return Err(DeserializeError::TypeMismatch {
1072 expected: "ordered field or sequence end for map",
1073 got: format!("{other:?}"),
1074 span: self.last_span,
1075 path: None,
1076 });
1077 }
1078 }
1079 }
1080 }
1081 other => {
1082 return Err(DeserializeError::TypeMismatch {
1083 expected: "struct start or sequence start for map",
1084 got: format!("{other:?}"),
1085 span: self.last_span,
1086 path: None,
1087 });
1088 }
1089 }
1090
1091 Ok(wip)
1092 }
1093
1094 fn deserialize_scalar(
1095 &mut self,
1096 mut wip: Partial<'input, BORROW>,
1097 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
1098 let shape = wip.shape();
1100
1101 let opaque_handled = match shape.type_identifier {
1104 "bool" | "u8" | "u16" | "u32" | "u64" | "u128" | "usize" | "i8" | "i16" | "i32"
1106 | "i64" | "i128" | "isize" | "f32" | "f64" | "String" | "&str" | "char" => false,
1107 _ => self.parser.hint_opaque_scalar(shape.type_identifier, shape),
1109 };
1110
1111 if !opaque_handled {
1113 let hint = match shape.type_identifier {
1114 "bool" => Some(ScalarTypeHint::Bool),
1115 "u8" => Some(ScalarTypeHint::U8),
1116 "u16" => Some(ScalarTypeHint::U16),
1117 "u32" => Some(ScalarTypeHint::U32),
1118 "u64" => Some(ScalarTypeHint::U64),
1119 "u128" => Some(ScalarTypeHint::U128),
1120 "usize" => Some(ScalarTypeHint::Usize),
1121 "i8" => Some(ScalarTypeHint::I8),
1122 "i16" => Some(ScalarTypeHint::I16),
1123 "i32" => Some(ScalarTypeHint::I32),
1124 "i64" => Some(ScalarTypeHint::I64),
1125 "i128" => Some(ScalarTypeHint::I128),
1126 "isize" => Some(ScalarTypeHint::Isize),
1127 "f32" => Some(ScalarTypeHint::F32),
1128 "f64" => Some(ScalarTypeHint::F64),
1129 "String" | "&str" => Some(ScalarTypeHint::String),
1130 "char" => Some(ScalarTypeHint::Char),
1131 _ if shape.is_from_str() => Some(ScalarTypeHint::String),
1134 _ => None,
1135 };
1136 if let Some(hint) = hint {
1137 self.parser.hint_scalar_type(hint);
1138 }
1139 }
1140
1141 let event = self.expect_event("value")?;
1142
1143 match event {
1144 ParseEvent::Scalar(scalar) => {
1145 wip = self.set_scalar(wip, scalar)?;
1146 Ok(wip)
1147 }
1148 ParseEvent::StructStart(_container_kind) => {
1149 let mut found_scalar: Option<ScalarValue<'input>> = None;
1151
1152 loop {
1153 let inner_event = self.expect_event("field or struct end")?;
1154 match inner_event {
1155 ParseEvent::StructEnd => break,
1156 ParseEvent::FieldKey(key) => {
1157 if key.name.as_deref() == Some("_arg") {
1159 let value_event = self.expect_event("argument value")?;
1160 if let ParseEvent::Scalar(scalar) = value_event {
1161 found_scalar = Some(scalar);
1162 } else {
1163 self.parser.skip_value().map_err(DeserializeError::Parser)?;
1165 }
1166 } else {
1167 self.parser.skip_value().map_err(DeserializeError::Parser)?;
1169 }
1170 }
1171 _ => {
1172 }
1174 }
1175 }
1176
1177 if let Some(scalar) = found_scalar {
1178 wip = self.set_scalar(wip, scalar)?;
1179 Ok(wip)
1180 } else {
1181 Err(DeserializeError::TypeMismatch {
1182 expected: "scalar value or node with argument",
1183 got: "node without argument".to_string(),
1184 span: self.last_span,
1185 path: None,
1186 })
1187 }
1188 }
1189 other => Err(DeserializeError::TypeMismatch {
1190 expected: "scalar value",
1191 got: format!("{other:?}"),
1192 span: self.last_span,
1193 path: None,
1194 }),
1195 }
1196 }
1197
1198 fn deserialize_map_key(
1212 &mut self,
1213 mut wip: Partial<'input, BORROW>,
1214 key: Option<Cow<'input, str>>,
1215 doc: Option<Vec<Cow<'input, str>>>,
1216 tag: Option<Cow<'input, str>>,
1217 ) -> Result<Partial<'input, BORROW>, DeserializeError<P::Error>> {
1218 let shape = wip.shape();
1219
1220 trace!(shape_name = %shape, shape_def = ?shape.def, ?key, ?doc, ?tag, "deserialize_map_key");
1221
1222 if shape.is_metadata_container() {
1224 trace!("deserialize_map_key: metadata container detected");
1225
1226 if let Type::User(UserType::Struct(st)) = &shape.ty {
1228 for field in st.fields {
1229 if field.metadata_kind() == Some("doc") {
1230 wip = wip
1232 .begin_field(field.effective_name())
1233 .map_err(DeserializeError::reflect)?;
1234 if let Some(ref doc_lines) = doc {
1235 wip = wip.begin_some().map_err(DeserializeError::reflect)?;
1237 wip = wip.init_list().map_err(DeserializeError::reflect)?;
1238 for line in doc_lines {
1239 wip = wip.begin_list_item().map_err(DeserializeError::reflect)?;
1240 wip = self.set_string_value(wip, line.clone())?;
1241 wip = wip.end().map_err(DeserializeError::reflect)?;
1242 }
1243 wip = wip.end().map_err(DeserializeError::reflect)?;
1244 } else {
1245 wip = wip.set_default().map_err(DeserializeError::reflect)?;
1247 }
1248 wip = wip.end().map_err(DeserializeError::reflect)?;
1249 } else if field.metadata_kind() == Some("tag") {
1250 wip = wip
1252 .begin_field(field.effective_name())
1253 .map_err(DeserializeError::reflect)?;
1254 if let Some(ref tag_name) = tag {
1255 wip = wip.begin_some().map_err(DeserializeError::reflect)?;
1257 wip = self.set_string_value(wip, tag_name.clone())?;
1258 wip = wip.end().map_err(DeserializeError::reflect)?;
1259 } else {
1260 wip = wip.set_default().map_err(DeserializeError::reflect)?;
1262 }
1263 wip = wip.end().map_err(DeserializeError::reflect)?;
1264 } else if field.metadata_kind().is_none() {
1265 wip = wip
1269 .begin_field(field.effective_name())
1270 .map_err(DeserializeError::reflect)?;
1271 wip = self.deserialize_map_key(wip, key.clone(), None, tag.clone())?;
1272 wip = wip.end().map_err(DeserializeError::reflect)?;
1273 }
1274 }
1275 }
1276
1277 return Ok(wip);
1278 }
1279
1280 if let Def::Option(_) = &shape.def {
1282 match key {
1283 None => {
1284 wip = wip.set_default().map_err(DeserializeError::reflect)?;
1286 return Ok(wip);
1287 }
1288 Some(inner_key) => {
1289 wip = wip.begin_some().map_err(DeserializeError::reflect)?;
1291 wip = self.deserialize_map_key(wip, Some(inner_key), None, None)?;
1292 wip = wip.end().map_err(DeserializeError::reflect)?;
1293 return Ok(wip);
1294 }
1295 }
1296 }
1297
1298 let key = key.ok_or_else(|| DeserializeError::TypeMismatch {
1300 expected: "named key",
1301 got: "unit key".to_string(),
1302 span: self.last_span,
1303 path: None,
1304 })?;
1305
1306 let is_pointer = matches!(shape.def, Def::Pointer(_));
1310 if shape.inner.is_some() && !is_pointer {
1311 wip = wip.begin_inner().map_err(DeserializeError::reflect)?;
1312 wip = self.deserialize_map_key(wip, Some(key), None, None)?;
1313 wip = wip.end().map_err(DeserializeError::reflect)?;
1314 return Ok(wip);
1315 }
1316
1317 if let Type::User(UserType::Enum(_)) = &shape.ty {
1319 wip = wip
1320 .select_variant_named(&key)
1321 .map_err(DeserializeError::reflect)?;
1322 return Ok(wip);
1323 }
1324
1325 if let Type::Primitive(PrimitiveType::Numeric(num_ty)) = &shape.ty {
1327 match num_ty {
1328 NumericType::Integer { signed } => {
1329 if *signed {
1330 let n: i64 = key.parse().map_err(|_| DeserializeError::TypeMismatch {
1331 expected: "valid integer for map key",
1332 got: format!("string '{}'", key),
1333 span: self.last_span,
1334 path: None,
1335 })?;
1336 wip = wip.set(n).map_err(DeserializeError::reflect)?;
1338 } else {
1339 let n: u64 = key.parse().map_err(|_| DeserializeError::TypeMismatch {
1340 expected: "valid unsigned integer for map key",
1341 got: format!("string '{}'", key),
1342 span: self.last_span,
1343 path: None,
1344 })?;
1345 wip = wip.set(n).map_err(DeserializeError::reflect)?;
1346 }
1347 return Ok(wip);
1348 }
1349 NumericType::Float => {
1350 let n: f64 = key.parse().map_err(|_| DeserializeError::TypeMismatch {
1351 expected: "valid float for map key",
1352 got: format!("string '{}'", key),
1353 span: self.last_span,
1354 path: None,
1355 })?;
1356 wip = wip.set(n).map_err(DeserializeError::reflect)?;
1357 return Ok(wip);
1358 }
1359 }
1360 }
1361
1362 wip = self.set_string_value(wip, key)?;
1364 Ok(wip)
1365 }
1366}