1use alloc::boxed::Box;
2use alloc::vec::Vec;
3use core::marker::PhantomData;
4
5use crate::State;
6use crate::Text;
7use crate::de::arena::Buffer;
8use crate::de::layer::{Layer, LayerEvent, Next};
9use crate::de::lexical::ContentKey;
10use crate::de::{Deserialize, InlineEvent, Sink, SinkHandle};
11use crate::error::{Error, ErrorKind};
12use crate::event::{Atom, ContainerShape, Event};
13
14pub struct DeserializeDriver<'a, 'de: 'a> {
53 core: DriverCore<'de>,
54 layers: Vec<Box<dyn Layer>>,
55 emit_layered: Option<EmitLayered<'de>>,
58 _marker: PhantomData<&'a mut ()>,
60}
61
62type EmitLayered<'de> =
64 fn(&mut Vec<Box<dyn Layer>>, &mut DriverCore<'de>, LayerEvent<'_, 'de>) -> Result<(), Error>;
65
66pub(crate) struct DriverCore<'de> {
68 pub(crate) state: State,
69 root: Option<SinkHandle<'de, 'de>>,
78 sink_stack: Vec<(SinkHandle<'de, 'de>, Container)>,
79 transient: usize,
84}
85
86const STACK_CAPACITY: usize = 128;
87
88const _: () = {
91 const fn assert_send<T: Send>() {}
92 assert_send::<DeserializeDriver<'static, 'static>>();
93};
94
95#[derive(Copy, Clone)]
96enum Container {
97 Map(bool, bool),
100 Seq(bool),
103 Inline(u32),
106 Content(bool, bool, bool),
111 SkipValue,
116}
117
118impl Container {
119 fn new(is_map: bool) -> Container {
121 if is_map {
122 Container::Map(true, false)
123 } else {
124 Container::Seq(false)
125 }
126 }
127
128 #[inline(always)]
130 fn is_multimap(&self) -> bool {
131 matches!(self, Container::Map(_, true))
132 }
133}
134
135unsafe fn erase_lifetime<'de>(handle: SinkHandle<'_, 'de>) -> SinkHandle<'de, 'de> {
142 unsafe { core::mem::transmute::<SinkHandle<'_, 'de>, SinkHandle<'de, 'de>>(handle) }
143}
144
145struct Lent<'a, 'de> {
148 driver: *mut DeserializeDriver<'a, 'de>,
149 id: usize,
150 outer: usize,
151}
152
153impl Drop for Lent<'_, '_> {
154 fn drop(&mut self) {
155 let driver = unsafe { &mut *self.driver };
157 if driver.core.transient == self.id {
158 driver.core.transient = self.outer;
159 return;
160 }
161 let replacement = core::mem::replace(
165 &mut driver.core,
166 DriverCore {
167 state: State::new(),
168 root: None,
169 sink_stack: Vec::new(),
170 transient: 0,
171 },
172 );
173 drop(replacement);
174 }
175}
176
177fn shorten<'r, 'a, 'de, 'f>(
182 driver: &'r mut DeserializeDriver<'a, 'de>,
183) -> &'r mut DeserializeDriver<'r, 'f>
184where
185 'de: 'f,
186 'f: 'r,
187{
188 unsafe { &mut *(driver as *mut DeserializeDriver<'a, 'de>).cast::<DeserializeDriver<'r, 'f>>() }
196}
197
198impl<'a, 'de> DeserializeDriver<'a, 'de> {
199 pub fn new<T: Deserialize<'de>>(out: &'a mut Option<T>) -> DeserializeDriver<'a, 'de> {
201 DeserializeDriver::from_fn(|state| T::deserialize_into(out, state))
202 }
203
204 pub fn update<T: Deserialize<'de>>(value: &'a mut T) -> DeserializeDriver<'a, 'de> {
232 DeserializeDriver::from_fn(|state| T::deserialize_update(value, state))
233 }
234
235 pub fn from_sink(sink: SinkHandle<'a, 'de>) -> DeserializeDriver<'a, 'de> {
240 DeserializeDriver::with_state(State::new(), sink, STACK_CAPACITY)
241 }
242
243 pub fn from_fn(
263 make: impl FnOnce(&mut State) -> SinkHandle<'a, 'de>,
264 ) -> DeserializeDriver<'a, 'de> {
265 let mut state = State::new();
268 let sink = make(&mut state);
269 DeserializeDriver::with_state(state, sink, STACK_CAPACITY)
270 }
271
272 pub fn from_state(state: State, sink: SinkHandle<'a, 'de>) -> DeserializeDriver<'a, 'de> {
278 DeserializeDriver::with_state(state, sink, STACK_CAPACITY)
279 }
280
281 pub(crate) fn nested<R>(
291 state: &mut State,
292 sink: SinkHandle<'_, 'de>,
293 is_map_key: bool,
294 f: impl FnOnce(&mut DeserializeDriver<'_, 'de>) -> R,
295 ) -> R {
296 let depth = state.depth;
297 let outer_is_map_key = state.is_map_key;
298 let outer_is_multimap = state.is_multimap;
299 let mut driver = DeserializeDriver::with_state(state.take(), sink, 0);
302 driver.core.state.is_map_key = is_map_key;
303 let rv = f(&mut driver);
304 driver.core.release();
307 *state = driver.core.state.take();
308 drop(driver);
309 state.depth = depth;
311 state.is_map_key = outer_is_map_key;
312 state.is_multimap = outer_is_multimap;
313 rv
314 }
315
316 fn with_state(
317 mut state: State,
318 sink: SinkHandle<'a, 'de>,
319 capacity: usize,
320 ) -> DeserializeDriver<'a, 'de> {
321 let sink_stack = state
323 .arena
324 .take_vec(Buffer::SinkStack)
325 .unwrap_or_else(|| Vec::with_capacity(capacity));
326 DeserializeDriver {
327 core: DriverCore {
328 state,
329 sink_stack,
330 root: Some(unsafe { erase_lifetime(sink) }),
332 transient: 0,
333 },
334 layers: Vec::new(),
335 emit_layered: None,
336 _marker: PhantomData,
337 }
338 }
339
340 pub fn state(&self) -> &State {
342 &self.core.state
343 }
344
345 pub fn state_mut(&mut self) -> &mut State {
350 &mut self.core.state
351 }
352
353 pub fn push_layer<L: Layer + 'static>(&mut self, layer: L) {
360 self.layers.push(Box::new(layer));
361 self.emit_layered = Some(emit_layered);
362 }
363
364 pub fn wrap_sink<F>(&mut self, f: F)
379 where
380 F: for<'x> FnOnce(SinkHandle<'x, 'de>, &mut State) -> SinkHandle<'x, 'de>,
381 {
382 assert!(
383 self.core.sink_stack.is_empty(),
384 "sinks can only be wrapped before events are emitted"
385 );
386 assert!(
388 self.core.transient == 0,
389 "sinks cannot be wrapped in a transient driver"
390 );
391 let root = self.core.root.take().expect("no active sink");
392 self.core.root = Some(f(root, &mut self.core.state));
393 }
394
395 #[inline]
405 pub fn emit<'e, E: Into<Event<'e>>>(&mut self, event: E) -> Result<(), Error> {
406 match event.into() {
407 Event::Atom(atom) => self.atom_event(atom),
408 Event::MapStart(shape) => self.start_event(true, shape),
409 Event::SeqStart(shape) => self.start_event(false, shape),
410 Event::MapEnd => self.end_event(true),
411 Event::SeqEnd => self.end_event(false),
412 }
413 }
414
415 #[inline]
433 pub fn emit_borrowed<E: Into<Event<'de>>>(&mut self, event: E) -> Result<(), Error> {
434 match event.into() {
435 Event::Atom(atom) => self.borrowed_atom_event(atom),
436 Event::MapStart(shape) => self.start_event(true, shape),
437 Event::SeqStart(shape) => self.start_event(false, shape),
438 Event::MapEnd => self.end_event(true),
439 Event::SeqEnd => self.end_event(false),
440 }
441 }
442
443 pub fn transient<'f, R>(&mut self, f: impl FnOnce(&mut DeserializeDriver<'_, 'f>) -> R) -> R
482 where
483 'de: 'f,
484 {
485 let marker = 0u8;
487 let id = &marker as *const u8 as usize;
488 let outer = core::mem::replace(&mut self.core.transient, id);
489 let driver: *mut DeserializeDriver<'a, 'de> = self;
490 let lent = Lent { driver, id, outer };
492 let rv = f(shorten(unsafe { &mut *driver }));
495 let replaced = unsafe { (*driver).core.transient != id };
497 drop(lent);
498 assert!(!replaced, "the driver was replaced while it was lent out");
499 rv
500 }
501
502 #[inline(never)]
507 fn atom_event(&mut self, atom: Atom) -> Result<(), Error> {
508 if !self.layers.is_empty() {
509 return self.emit_layered(LayerEvent::new(Event::Atom(atom)));
510 }
511 let rv = self.core.deliver_atom(atom);
512 self.core.finish_event(rv)
513 }
514
515 #[inline(never)]
516 fn borrowed_atom_event(&mut self, atom: Atom<'de>) -> Result<(), Error> {
517 if !self.layers.is_empty() {
518 return self.emit_layered(LayerEvent::borrowed(Event::Atom(atom)));
519 }
520 let rv = self.core.deliver_borrowed_atom(atom);
521 self.core.finish_event(rv)
522 }
523
524 #[inline(never)]
525 fn start_event(&mut self, is_map: bool, shape: ContainerShape) -> Result<(), Error> {
526 if !self.layers.is_empty() {
527 let event = if is_map {
528 Event::MapStart(shape)
529 } else {
530 Event::SeqStart(shape)
531 };
532 return self.emit_layered(LayerEvent::new(event));
533 }
534 let rv = self.core.deliver_start(is_map, shape);
535 self.core.finish_event(rv)
536 }
537
538 #[inline(never)]
539 fn end_event(&mut self, is_map: bool) -> Result<(), Error> {
540 if !self.layers.is_empty() {
541 let event = if is_map { Event::MapEnd } else { Event::SeqEnd };
542 return self.emit_layered(LayerEvent::new(event));
543 }
544 let rv = self.core.deliver_end(is_map);
545 self.core.finish_event(rv)
546 }
547
548 #[cold]
553 #[inline(never)]
554 fn emit_layered(&mut self, event: LayerEvent<'_, 'de>) -> Result<(), Error> {
555 let emit = self.emit_layered.expect("layers without push_layer");
556 let rv = emit(&mut self.layers, &mut self.core, event);
557 self.core.finish_event(rv)
558 }
559}
560
561fn emit_layered<'de>(
566 layers: &mut Vec<Box<dyn Layer>>,
567 core: &mut DriverCore<'de>,
568 event: LayerEvent<'_, 'de>,
569) -> Result<(), Error> {
570 Next::new(layers, core).emit(event)
571}
572
573impl<'de> DriverCore<'de> {
574 #[inline(always)]
578 fn finish_event(&mut self, rv: Result<(), Error>) -> Result<(), Error> {
579 let rv = match rv {
580 Ok(()) => Ok(()),
581 Err(err) if self.state.discards_errors => Err(err),
583 Err(err) => Err(self.state.attach_error_context(err)),
584 };
585 self.state.clear_event();
586 rv
587 }
588
589 #[inline]
591 pub(crate) fn update_position(&mut self, event: &Event<'_>) {
592 self.state.is_map_key = match event {
593 Event::MapEnd | Event::SeqEnd => false,
594 _ => matches!(self.sink_stack.last(), Some((_, Container::Map(true, _)))),
597 };
598 }
599
600 #[inline(always)]
602 pub(crate) fn dispatch(&mut self, event: Event<'_>) -> Result<(), Error> {
603 match event {
604 Event::Atom(atom) => self.deliver_atom(atom),
605 Event::MapStart(shape) => self.deliver_start(true, shape),
606 Event::SeqStart(shape) => self.deliver_start(false, shape),
607 Event::MapEnd => self.deliver_end(true),
608 Event::SeqEnd => self.deliver_end(false),
609 }
610 }
611
612 #[inline(always)]
614 pub(crate) fn dispatch_borrowed(&mut self, event: Event<'de>) -> Result<(), Error> {
615 match event {
616 Event::Atom(atom) => self.deliver_borrowed_atom(atom),
617 Event::MapStart(shape) => self.deliver_start(true, shape),
618 Event::SeqStart(shape) => self.deliver_start(false, shape),
619 Event::MapEnd => self.deliver_end(true),
620 Event::SeqEnd => self.deliver_end(false),
621 }
622 }
623
624 #[inline(always)]
629 fn deliver_atom(&mut self, atom: Atom) -> Result<(), Error> {
630 match self.emit_atom(atom) {
631 Ok(()) => Ok(()),
632 Err(err) => self.recover(err, None),
633 }
634 }
635
636 #[inline(always)]
637 fn deliver_borrowed_atom(&mut self, atom: Atom<'de>) -> Result<(), Error> {
638 if self.transient != 0 {
641 return self.deliver_atom(atom);
642 }
643 match self.emit_borrowed_atom(atom) {
644 Ok(()) => Ok(()),
645 Err(err) => self.recover(err, None),
646 }
647 }
648
649 #[inline(always)]
650 fn deliver_start(&mut self, is_map: bool, shape: ContainerShape) -> Result<(), Error> {
651 match self.emit_start(is_map, shape) {
652 Ok(()) => Ok(()),
653 Err(err) => self.recover(err, Some(is_map)),
654 }
655 }
656
657 #[inline(always)]
658 fn deliver_end(&mut self, is_map: bool) -> Result<(), Error> {
659 match self.emit_end(is_map) {
660 Ok(()) => Ok(()),
661 Err(err) => self.recover(err, None),
662 }
663 }
664
665 #[cold]
677 #[inline(never)]
678 fn recover(&mut self, err: Error, opened: Option<bool>) -> Result<(), Error> {
679 let mut err = if self.state.discards_errors {
680 err
682 } else {
683 self.state.attach_error_context(err)
684 };
685 if let Some((_, container @ Container::Inline(_))) = self.sink_stack.last_mut() {
688 *container = Container::Seq(true);
689 self.sink_stack
690 .push((SinkHandle::null(), Container::Seq(false)));
691 }
692 for idx in (0..self.sink_stack.len()).rev() {
693 let (sink, container) = &mut self.sink_stack[idx];
695 err = match sink.recover(err, &mut self.state) {
696 Ok(()) => {
697 if let Container::Map(is_key @ false, _) = container {
699 *is_key = true;
700 self.sink_stack
701 .insert(idx + 1, (SinkHandle::null(), Container::SkipValue));
702 }
703 if let Some(is_map) = opened {
704 self.state.depth += 1;
705 self.sink_stack
706 .push((SinkHandle::null(), Container::new(is_map)));
707 }
708 return Ok(());
709 }
710 Err(err) => err,
711 };
712 *sink = SinkHandle::null();
713 *container = match *container {
714 Container::Seq(_) => Container::Seq(false),
715 other => other,
716 };
717 }
718 self.sink_stack.clear();
720 Err(err)
721 }
722
723 #[cold]
725 #[inline(never)]
726 fn skip_value(&mut self) {
727 self.state.is_map_key = false;
728 self.sink_stack.pop();
729 }
730
731 #[inline(always)]
732 fn emit_borrowed_atom(&mut self, atom: Atom<'de>) -> Result<(), Error> {
733 match self.sink_stack.last_mut() {
734 Some((sink, Container::Map(is_key, _))) => {
735 let key = *is_key;
736 *is_key = !key;
737 self.state.is_map_key = key;
738 if key {
739 sink.__private_borrowed_key_atom(atom, &mut self.state)
740 } else {
741 sink.__private_borrowed_value_atom(atom, &mut self.state)
742 }
743 }
744 Some((sink, Container::Seq(_))) => {
745 self.state.is_map_key = false;
746 sink.__private_borrowed_value_atom(atom, &mut self.state)
747 }
748 Some((sink, Container::Inline(index))) => {
749 let item = *index;
750 *index = item.saturating_add(1);
751 self.state.is_map_key = false;
752 sink.__private_inline_atom(item as usize, atom, &mut self.state)
753 }
754 Some((sink, Container::Content(is_key, take, found))) => {
755 match content_atom(&self.state, is_key, take, found, &atom)? {
756 true => sink.borrowed_atom(atom, &mut self.state),
757 false => Ok(()),
758 }
759 }
760 Some((_, Container::SkipValue)) => {
761 self.skip_value();
762 Ok(())
763 }
764 None => {
765 let sink = self.root.as_mut().expect("no active sink");
766 sink.borrowed_atom(atom, &mut self.state)?;
767 sink.finish(&mut self.state)
768 }
769 }
770 }
771
772 #[inline(always)]
773 fn emit_atom(&mut self, atom: Atom) -> Result<(), Error> {
774 match self.sink_stack.last_mut() {
775 Some((sink, Container::Map(is_key, _))) => {
776 let key = *is_key;
777 *is_key = !key;
778 self.state.is_map_key = key;
779 if key {
780 sink.__private_key_atom(atom, &mut self.state)
781 } else {
782 sink.__private_value_atom(atom, &mut self.state)
783 }
784 }
785 Some((sink, Container::Seq(_))) => {
786 self.state.is_map_key = false;
787 sink.__private_value_atom(atom, &mut self.state)
788 }
789 Some((sink, Container::Inline(index))) => {
790 let item = *index;
791 *index = item.saturating_add(1);
792 self.state.is_map_key = false;
793 sink.__private_inline_atom(item as usize, atom, &mut self.state)
794 }
795 Some((sink, Container::Content(is_key, take, found))) => {
796 match content_atom(&self.state, is_key, take, found, &atom)? {
797 true => sink.atom(atom, &mut self.state),
798 false => Ok(()),
799 }
800 }
801 Some((_, Container::SkipValue)) => {
802 self.skip_value();
803 Ok(())
804 }
805 None => {
806 let sink = self.root.as_mut().expect("no active sink");
807 sink.atom(atom, &mut self.state)?;
808 sink.finish(&mut self.state)
809 }
810 }
811 }
812
813 #[inline(always)]
814 fn emit_start(&mut self, is_map: bool, shape: ContainerShape) -> Result<(), Error> {
815 let mut sink = match self.sink_stack.last_mut() {
816 Some((parent, Container::Map(is_key, _))) => {
817 let key = *is_key;
818 *is_key = !key;
819 self.state.is_map_key = key;
820 let sink = if key {
821 parent.next_key(&mut self.state)?
822 } else {
823 parent.next_value(&mut self.state)?
824 };
825 unsafe { erase_lifetime(sink) }
829 }
830 Some((parent, container @ Container::Seq(_))) => {
831 self.state.is_map_key = false;
832 if let (Container::Seq(true), false) = (*container, is_map) {
833 self.state.container_shape = shape;
835 parent.__private_inline_event(InlineEvent::Start, &mut self.state)?;
836 *container = Container::Inline(0);
837 self.state.is_multimap = false;
838 self.state.depth += 1;
839 return Ok(());
840 }
841 let sink = parent.next_value(&mut self.state)?;
842 unsafe { erase_lifetime(sink) }
844 }
845 Some((parent, Container::Inline(index))) => {
848 let item = *index;
849 *index = item.saturating_add(1);
850 self.state.is_map_key = false;
851 self.state.container_shape = shape;
852 let event = InlineEvent::Container(item as usize, is_map);
853 return parent.__private_inline_event(event, &mut self.state);
854 }
855 Some((_, Container::Content(is_key, take, _))) => {
857 if *is_key || *take {
858 return Err(content_container_error(*is_key));
859 }
860 *is_key = true;
861 self.state.is_map_key = false;
862 self.state.depth += 1;
863 self.sink_stack
864 .push((SinkHandle::null(), Container::new(is_map)));
865 return Ok(());
866 }
867 Some((_, container @ Container::SkipValue)) => {
869 self.state.is_map_key = false;
870 *container = Container::new(is_map);
871 self.state.depth += 1;
872 return Ok(());
873 }
874 None => self.root.take().expect("no active sink"),
875 };
876 self.state.container_shape = shape;
877 let container = if is_map {
878 match sink.map(&mut self.state) {
879 Ok(()) => Container::Map(true, shape.is_multimap()),
880 Err(err)
882 if err.kind() == ErrorKind::Unexpected
883 && ContentKey::of(&self.state).is_some() =>
884 {
885 Container::Content(true, false, false)
886 }
887 Err(err) => return Err(err),
888 }
889 } else {
890 Container::Seq(sink.__private_seq(&mut self.state)?)
891 };
892 self.state.is_multimap = container.is_multimap();
893 self.state.depth += 1;
894 self.sink_stack.push((sink, container));
895 Ok(())
896 }
897
898 #[inline(always)]
899 fn emit_end(&mut self, is_map: bool) -> Result<(), Error> {
900 match self.sink_stack.last() {
901 Some((_, Container::Map(..) | Container::Content(..))) if is_map => {}
902 Some((_, Container::Seq(_))) if !is_map => {}
903 Some((_, Container::Inline(_))) if !is_map => return self.end_inline(),
904 _ => panic!("not inside a {}", if is_map { "map" } else { "sequence" }),
905 }
906 let (mut sink, container) = self.sink_stack.pop().unwrap();
907 self.state.is_multimap = container.is_multimap();
911 let mut rv = Ok(());
912 if let Container::Content(_, _, false) = container {
914 self.state.is_map_key = false;
915 rv = sink
916 .atom(Atom::Lexical(Text::borrowed("")), &mut self.state)
917 .map_err(|err| match err.kind() {
918 ErrorKind::Unexpected => {
920 super::default_container(&mut sink, "map", &self.state).unwrap_err()
921 }
922 _ => err,
923 });
924 }
925 let rv = rv.and_then(|()| sink.finish(&mut self.state));
926 self.state.depth -= 1;
927 self.state.is_multimap = self
928 .sink_stack
929 .last()
930 .is_some_and(|(_, container)| container.is_multimap());
931 if self.sink_stack.is_empty() {
932 self.root = Some(sink);
934 } else {
935 sink.release(&mut self.state);
936 }
937 rv
938 }
939
940 #[inline(always)]
945 fn end_inline(&mut self) -> Result<(), Error> {
946 let (sink, container) = self.sink_stack.last_mut().unwrap();
947 let Container::Inline(len) = *container else {
948 unreachable!()
949 };
950 *container = Container::Seq(true);
951 self.state.is_multimap = false;
952 let rv = sink.__private_inline_event(InlineEvent::End(len as usize), &mut self.state);
953 self.state.depth -= 1;
954 rv
955 }
956}
957
958#[cold]
963#[inline(never)]
964fn content_atom(
965 state: &State,
966 is_key: &mut bool,
967 take: &mut bool,
968 found: &mut bool,
969 atom: &Atom<'_>,
970) -> Result<bool, Error> {
971 let was_key = *is_key;
972 *is_key = !was_key;
973 if was_key {
974 *take = match atom {
975 Atom::Str(key) | Atom::Lexical(key) => ContentKey::of(state) == Some(&**key),
976 _ => false,
977 };
978 return Ok(false);
979 }
980 if !core::mem::take(take) {
981 return Ok(false);
982 }
983 if core::mem::replace(found, true) {
984 return Err(Error::new(
985 ErrorKind::Unexpected,
986 "unexpected map with more than one content, expected a single value",
987 ));
988 }
989 Ok(true)
990}
991
992#[cold]
993fn content_container_error(is_key: bool) -> Error {
994 Error::new(
995 ErrorKind::Unexpected,
996 if is_key {
997 "unexpected map with a key that is not a single value, expected a single value"
998 } else {
999 "unexpected map whose content is not a single value, expected a single value"
1000 },
1001 )
1002}
1003
1004impl<'de> DriverCore<'de> {
1005 fn release(&mut self) {
1007 while let Some((sink, _)) = self.sink_stack.pop() {
1009 sink.release(&mut self.state);
1010 }
1011 if let Some(root) = self.root.take() {
1014 root.release(&mut self.state);
1015 }
1016 let stack = core::mem::take(&mut self.sink_stack);
1017 self.state.arena.put_vec(Buffer::SinkStack, stack);
1018 }
1019}
1020
1021impl<'de> Drop for DriverCore<'de> {
1022 fn drop(&mut self) {
1023 self.release();
1024 }
1025}
1026
1027#[test]
1028fn test_arena_is_not_orphaned() {
1029 use crate::de::Recording;
1030 use crate::de::arena::ORPHANED;
1031 use alloc::collections::BTreeMap;
1032 use alloc::string::String;
1033
1034 let orphaned = ORPHANED.with(|x| x.get());
1035 let mut out = None::<Vec<BTreeMap<String, Vec<u32>>>>;
1037 let mut driver = DeserializeDriver::new(&mut out);
1038 for event in [
1039 Event::seq_start(),
1040 Event::map_start(),
1041 "a".into(),
1042 Event::seq_start(),
1043 1u64.into(),
1044 Event::SeqEnd,
1045 Event::MapEnd,
1046 Event::SeqEnd,
1047 ] {
1048 driver.emit(event).unwrap();
1049 }
1050 drop(driver);
1051 assert_eq!(out.unwrap()[0]["a"], [1]);
1052
1053 let mut recording = Recording::new();
1055 let mut driver = DeserializeDriver::from_fn(|state| recording.recorder(state));
1056 for event in [Event::seq_start(), 1u64.into(), 2u64.into(), Event::SeqEnd] {
1057 driver.emit(event).unwrap();
1058 }
1059 drop(driver);
1060 let mut driver_out = None::<()>;
1061 let mut driver = DeserializeDriver::new(&mut driver_out);
1062 let mut out = None::<Vec<u32>>;
1063 let state = driver.state_mut();
1064 recording
1065 .replay(Vec::<u32>::deserialize_into(&mut out, state), state)
1066 .unwrap();
1067 drop(driver);
1068 assert_eq!(out.unwrap(), [1, 2]);
1069
1070 let mut out = None::<Vec<Vec<u32>>>;
1072 let mut driver = DeserializeDriver::new(&mut out);
1073 driver.emit(Event::seq_start()).unwrap();
1074 driver.emit(Event::seq_start()).unwrap();
1075 assert!(driver.emit("not a number").is_err());
1076 drop(driver);
1077
1078 assert_eq!(ORPHANED.with(|x| x.get()), orphaned);
1079}
1080
1081#[test]
1082fn test_sink_outlives_state() {
1083 use crate::de::OwnedSink;
1084 use crate::de::arena::ORPHANED;
1085 use alloc::collections::BTreeMap;
1086 use alloc::string::String;
1087
1088 let orphaned = ORPHANED.with(|x| x.get());
1091 let mut out = None::<Vec<BTreeMap<String, u32>>>;
1092 let mut driver = DeserializeDriver::from_sink(Vec::<BTreeMap<String, u32>>::deserialize_into(
1093 &mut out,
1094 &mut State::new(),
1095 ));
1096 assert_eq!(ORPHANED.with(|x| x.get()), orphaned + 1);
1097 for event in [
1098 Event::seq_start(),
1099 Event::map_start(),
1100 "a".into(),
1101 1u64.into(),
1102 Event::MapEnd,
1103 Event::SeqEnd,
1104 ] {
1105 driver.emit(event).unwrap();
1106 }
1107 drop(driver);
1108 assert_eq!(out.unwrap()[0]["a"], 1);
1109
1110 let mut driver_out = None::<()>;
1112 let mut driver = DeserializeDriver::new(&mut driver_out);
1113 let mut owned = OwnedSink::<Vec<u32>>::deserialize(driver.state_mut());
1114 drop(driver);
1115 assert_eq!(ORPHANED.with(|x| x.get()), orphaned + 2);
1116 let mut driver = DeserializeDriver::from_sink(SinkHandle::to(owned.borrow_mut()));
1117 for event in [Event::seq_start(), 1u64.into(), 2u64.into(), Event::SeqEnd] {
1118 driver.emit(event).unwrap();
1119 }
1120 drop(driver);
1121 assert_eq!(owned.take().unwrap(), [1, 2]);
1122 std::thread::spawn(move || drop(owned)).join().unwrap();
1124}
1125
1126#[test]
1127fn test_driver() {
1128 let mut out: Option<alloc::collections::BTreeMap<u32, String>> = None;
1129 {
1130 let mut driver = DeserializeDriver::new(&mut out);
1131 driver.emit(Event::map_start()).unwrap();
1132 driver.emit(1u64).unwrap();
1133 driver.emit("Hello").unwrap();
1134 driver.emit(2u64).unwrap();
1135 driver.emit("World").unwrap();
1136 driver.emit(Event::MapEnd).unwrap();
1137 }
1138
1139 let map = out.unwrap();
1140 assert_eq!(map[&1], "Hello");
1141 assert_eq!(map[&2], "World");
1142}