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 _marker: PhantomData<&'a mut ()>,
57}
58
59pub(crate) struct DriverCore<'de> {
61 pub(crate) state: State,
62 root: Option<SinkHandle<'de, 'de>>,
71 sink_stack: Vec<(SinkHandle<'de, 'de>, Container)>,
72 transient: usize,
77}
78
79const STACK_CAPACITY: usize = 128;
80
81const _: () = {
84 const fn assert_send<T: Send>() {}
85 assert_send::<DeserializeDriver<'static, 'static>>();
86};
87
88#[derive(Copy, Clone)]
89enum Container {
90 Map(bool, bool),
93 Seq(bool),
96 Inline(u32),
99 Content(bool, bool, bool),
104 SkipValue,
109}
110
111impl Container {
112 fn new(is_map: bool) -> Container {
114 if is_map {
115 Container::Map(true, false)
116 } else {
117 Container::Seq(false)
118 }
119 }
120
121 #[inline(always)]
123 fn is_multimap(&self) -> bool {
124 matches!(self, Container::Map(_, true))
125 }
126}
127
128unsafe fn erase_lifetime<'de>(handle: SinkHandle<'_, 'de>) -> SinkHandle<'de, 'de> {
135 unsafe { core::mem::transmute::<SinkHandle<'_, 'de>, SinkHandle<'de, 'de>>(handle) }
136}
137
138struct Lent<'a, 'de> {
141 driver: *mut DeserializeDriver<'a, 'de>,
142 id: usize,
143 outer: usize,
144}
145
146impl Drop for Lent<'_, '_> {
147 fn drop(&mut self) {
148 let driver = unsafe { &mut *self.driver };
150 if driver.core.transient == self.id {
151 driver.core.transient = self.outer;
152 return;
153 }
154 let replacement = core::mem::replace(
158 &mut driver.core,
159 DriverCore {
160 state: State::new(),
161 root: None,
162 sink_stack: Vec::new(),
163 transient: 0,
164 },
165 );
166 drop(replacement);
167 }
168}
169
170fn shorten<'r, 'a, 'de, 'f>(
175 driver: &'r mut DeserializeDriver<'a, 'de>,
176) -> &'r mut DeserializeDriver<'r, 'f>
177where
178 'de: 'f,
179 'f: 'r,
180{
181 unsafe { &mut *(driver as *mut DeserializeDriver<'a, 'de>).cast::<DeserializeDriver<'r, 'f>>() }
189}
190
191impl<'a, 'de> DeserializeDriver<'a, 'de> {
192 pub fn new<T: Deserialize<'de>>(out: &'a mut Option<T>) -> DeserializeDriver<'a, 'de> {
194 DeserializeDriver::from_fn(|state| T::deserialize_into(out, state))
195 }
196
197 pub fn update<T: Deserialize<'de>>(value: &'a mut T) -> DeserializeDriver<'a, 'de> {
225 DeserializeDriver::from_fn(|state| T::deserialize_update(value, state))
226 }
227
228 pub fn from_sink(sink: SinkHandle<'a, 'de>) -> DeserializeDriver<'a, 'de> {
233 DeserializeDriver::with_state(State::new(), sink, STACK_CAPACITY)
234 }
235
236 pub fn from_fn(
256 make: impl FnOnce(&mut State) -> SinkHandle<'a, 'de>,
257 ) -> DeserializeDriver<'a, 'de> {
258 let mut state = State::new();
261 let sink = make(&mut state);
262 DeserializeDriver::with_state(state, sink, STACK_CAPACITY)
263 }
264
265 pub fn from_state(state: State, sink: SinkHandle<'a, 'de>) -> DeserializeDriver<'a, 'de> {
271 DeserializeDriver::with_state(state, sink, STACK_CAPACITY)
272 }
273
274 pub(crate) fn nested<R>(
284 state: &mut State,
285 sink: SinkHandle<'_, 'de>,
286 is_map_key: bool,
287 f: impl FnOnce(&mut DeserializeDriver<'_, 'de>) -> R,
288 ) -> R {
289 let depth = state.depth;
290 let outer_is_map_key = state.is_map_key;
291 let outer_is_multimap = state.is_multimap;
292 let mut driver = DeserializeDriver::with_state(state.take(), sink, 0);
295 driver.core.state.is_map_key = is_map_key;
296 let rv = f(&mut driver);
297 driver.core.release();
300 *state = driver.core.state.take();
301 drop(driver);
302 state.depth = depth;
304 state.is_map_key = outer_is_map_key;
305 state.is_multimap = outer_is_multimap;
306 rv
307 }
308
309 fn with_state(
310 mut state: State,
311 sink: SinkHandle<'a, 'de>,
312 capacity: usize,
313 ) -> DeserializeDriver<'a, 'de> {
314 let sink_stack = state
316 .arena
317 .take_vec(Buffer::SinkStack)
318 .unwrap_or_else(|| Vec::with_capacity(capacity));
319 DeserializeDriver {
320 core: DriverCore {
321 state,
322 sink_stack,
323 root: Some(unsafe { erase_lifetime(sink) }),
325 transient: 0,
326 },
327 layers: Vec::new(),
328 _marker: PhantomData,
329 }
330 }
331
332 pub fn state(&self) -> &State {
334 &self.core.state
335 }
336
337 pub fn state_mut(&mut self) -> &mut State {
342 &mut self.core.state
343 }
344
345 pub fn push_layer<L: Layer + 'static>(&mut self, layer: L) {
352 self.layers.push(Box::new(layer));
353 }
354
355 pub fn wrap_sink<F>(&mut self, f: F)
370 where
371 F: for<'x> FnOnce(SinkHandle<'x, 'de>, &mut State) -> SinkHandle<'x, 'de>,
372 {
373 assert!(
374 self.core.sink_stack.is_empty(),
375 "sinks can only be wrapped before events are emitted"
376 );
377 assert!(
379 self.core.transient == 0,
380 "sinks cannot be wrapped in a transient driver"
381 );
382 let root = self.core.root.take().expect("no active sink");
383 self.core.root = Some(f(root, &mut self.core.state));
384 }
385
386 #[inline]
396 pub fn emit<'e, E: Into<Event<'e>>>(&mut self, event: E) -> Result<(), Error> {
397 match event.into() {
398 Event::Atom(atom) => self.atom_event(atom),
399 Event::MapStart(shape) => self.start_event(true, shape),
400 Event::SeqStart(shape) => self.start_event(false, shape),
401 Event::MapEnd => self.end_event(true),
402 Event::SeqEnd => self.end_event(false),
403 }
404 }
405
406 #[inline]
424 pub fn emit_borrowed<E: Into<Event<'de>>>(&mut self, event: E) -> Result<(), Error> {
425 match event.into() {
426 Event::Atom(atom) => self.borrowed_atom_event(atom),
427 Event::MapStart(shape) => self.start_event(true, shape),
428 Event::SeqStart(shape) => self.start_event(false, shape),
429 Event::MapEnd => self.end_event(true),
430 Event::SeqEnd => self.end_event(false),
431 }
432 }
433
434 pub fn transient<'f, R>(&mut self, f: impl FnOnce(&mut DeserializeDriver<'_, 'f>) -> R) -> R
473 where
474 'de: 'f,
475 {
476 let marker = 0u8;
478 let id = &marker as *const u8 as usize;
479 let outer = core::mem::replace(&mut self.core.transient, id);
480 let driver: *mut DeserializeDriver<'a, 'de> = self;
481 let lent = Lent { driver, id, outer };
483 let rv = f(shorten(unsafe { &mut *driver }));
486 let replaced = unsafe { (*driver).core.transient != id };
488 drop(lent);
489 assert!(!replaced, "the driver was replaced while it was lent out");
490 rv
491 }
492
493 #[inline(never)]
498 fn atom_event(&mut self, atom: Atom) -> Result<(), Error> {
499 if !self.layers.is_empty() {
500 return self.emit_layered(LayerEvent::new(Event::Atom(atom)));
501 }
502 let rv = self.core.deliver_atom(atom);
503 self.core.finish_event(rv)
504 }
505
506 #[inline(never)]
507 fn borrowed_atom_event(&mut self, atom: Atom<'de>) -> Result<(), Error> {
508 if !self.layers.is_empty() {
509 return self.emit_layered(LayerEvent::borrowed(Event::Atom(atom)));
510 }
511 let rv = self.core.deliver_borrowed_atom(atom);
512 self.core.finish_event(rv)
513 }
514
515 #[inline(never)]
516 fn start_event(&mut self, is_map: bool, shape: ContainerShape) -> Result<(), Error> {
517 if !self.layers.is_empty() {
518 let event = if is_map {
519 Event::MapStart(shape)
520 } else {
521 Event::SeqStart(shape)
522 };
523 return self.emit_layered(LayerEvent::new(event));
524 }
525 let rv = self.core.deliver_start(is_map, shape);
526 self.core.finish_event(rv)
527 }
528
529 #[inline(never)]
530 fn end_event(&mut self, is_map: bool) -> Result<(), Error> {
531 if !self.layers.is_empty() {
532 let event = if is_map { Event::MapEnd } else { Event::SeqEnd };
533 return self.emit_layered(LayerEvent::new(event));
534 }
535 let rv = self.core.deliver_end(is_map);
536 self.core.finish_event(rv)
537 }
538
539 #[cold]
544 #[inline(never)]
545 fn emit_layered(&mut self, event: LayerEvent<'_, 'de>) -> Result<(), Error> {
546 let rv = Next::new(&mut self.layers, &mut self.core).emit(event);
547 self.core.finish_event(rv)
548 }
549}
550
551impl<'de> DriverCore<'de> {
552 #[inline(always)]
556 fn finish_event(&mut self, rv: Result<(), Error>) -> Result<(), Error> {
557 let rv = match rv {
558 Ok(()) => Ok(()),
559 Err(err) if self.state.discards_errors => Err(err),
561 Err(err) => Err(self.state.attach_error_context(err)),
562 };
563 self.state.clear_event();
564 rv
565 }
566
567 #[inline]
569 pub(crate) fn update_position(&mut self, event: &Event<'_>) {
570 self.state.is_map_key = match event {
571 Event::MapEnd | Event::SeqEnd => false,
572 _ => matches!(self.sink_stack.last(), Some((_, Container::Map(true, _)))),
575 };
576 }
577
578 #[inline(always)]
580 pub(crate) fn dispatch(&mut self, event: Event<'_>) -> Result<(), Error> {
581 match event {
582 Event::Atom(atom) => self.deliver_atom(atom),
583 Event::MapStart(shape) => self.deliver_start(true, shape),
584 Event::SeqStart(shape) => self.deliver_start(false, shape),
585 Event::MapEnd => self.deliver_end(true),
586 Event::SeqEnd => self.deliver_end(false),
587 }
588 }
589
590 #[inline(always)]
592 pub(crate) fn dispatch_borrowed(&mut self, event: Event<'de>) -> Result<(), Error> {
593 match event {
594 Event::Atom(atom) => self.deliver_borrowed_atom(atom),
595 Event::MapStart(shape) => self.deliver_start(true, shape),
596 Event::SeqStart(shape) => self.deliver_start(false, shape),
597 Event::MapEnd => self.deliver_end(true),
598 Event::SeqEnd => self.deliver_end(false),
599 }
600 }
601
602 #[inline(always)]
607 fn deliver_atom(&mut self, atom: Atom) -> Result<(), Error> {
608 match self.emit_atom(atom) {
609 Ok(()) => Ok(()),
610 Err(err) => self.recover(err, None),
611 }
612 }
613
614 #[inline(always)]
615 fn deliver_borrowed_atom(&mut self, atom: Atom<'de>) -> Result<(), Error> {
616 if self.transient != 0 {
619 return self.deliver_atom(atom);
620 }
621 match self.emit_borrowed_atom(atom) {
622 Ok(()) => Ok(()),
623 Err(err) => self.recover(err, None),
624 }
625 }
626
627 #[inline(always)]
628 fn deliver_start(&mut self, is_map: bool, shape: ContainerShape) -> Result<(), Error> {
629 match self.emit_start(is_map, shape) {
630 Ok(()) => Ok(()),
631 Err(err) => self.recover(err, Some(is_map)),
632 }
633 }
634
635 #[inline(always)]
636 fn deliver_end(&mut self, is_map: bool) -> Result<(), Error> {
637 match self.emit_end(is_map) {
638 Ok(()) => Ok(()),
639 Err(err) => self.recover(err, None),
640 }
641 }
642
643 #[cold]
655 #[inline(never)]
656 fn recover(&mut self, err: Error, opened: Option<bool>) -> Result<(), Error> {
657 let mut err = if self.state.discards_errors {
658 err
660 } else {
661 self.state.attach_error_context(err)
662 };
663 if let Some((_, container @ Container::Inline(_))) = self.sink_stack.last_mut() {
666 *container = Container::Seq(true);
667 self.sink_stack
668 .push((SinkHandle::null(), Container::Seq(false)));
669 }
670 for idx in (0..self.sink_stack.len()).rev() {
671 let (sink, container) = &mut self.sink_stack[idx];
673 err = match sink.recover(err, &mut self.state) {
674 Ok(()) => {
675 if let Container::Map(is_key @ false, _) = container {
677 *is_key = true;
678 self.sink_stack
679 .insert(idx + 1, (SinkHandle::null(), Container::SkipValue));
680 }
681 if let Some(is_map) = opened {
682 self.state.depth += 1;
683 self.sink_stack
684 .push((SinkHandle::null(), Container::new(is_map)));
685 }
686 return Ok(());
687 }
688 Err(err) => err,
689 };
690 *sink = SinkHandle::null();
691 *container = match *container {
692 Container::Seq(_) => Container::Seq(false),
693 other => other,
694 };
695 }
696 self.sink_stack.clear();
698 Err(err)
699 }
700
701 #[cold]
703 #[inline(never)]
704 fn skip_value(&mut self) {
705 self.state.is_map_key = false;
706 self.sink_stack.pop();
707 }
708
709 #[inline(always)]
710 fn emit_borrowed_atom(&mut self, atom: Atom<'de>) -> Result<(), Error> {
711 match self.sink_stack.last_mut() {
712 Some((sink, Container::Map(is_key, _))) => {
713 let key = *is_key;
714 *is_key = !key;
715 self.state.is_map_key = key;
716 if key {
717 sink.__private_borrowed_key_atom(atom, &mut self.state)
718 } else {
719 sink.__private_borrowed_value_atom(atom, &mut self.state)
720 }
721 }
722 Some((sink, Container::Seq(_))) => {
723 self.state.is_map_key = false;
724 sink.__private_borrowed_value_atom(atom, &mut self.state)
725 }
726 Some((sink, Container::Inline(index))) => {
727 let item = *index;
728 *index = item.saturating_add(1);
729 self.state.is_map_key = false;
730 sink.__private_inline_atom(item as usize, atom, &mut self.state)
731 }
732 Some((sink, Container::Content(is_key, take, found))) => {
733 match content_atom(&self.state, is_key, take, found, &atom)? {
734 true => sink.borrowed_atom(atom, &mut self.state),
735 false => Ok(()),
736 }
737 }
738 Some((_, Container::SkipValue)) => {
739 self.skip_value();
740 Ok(())
741 }
742 None => {
743 let sink = self.root.as_mut().expect("no active sink");
744 sink.borrowed_atom(atom, &mut self.state)?;
745 sink.finish(&mut self.state)
746 }
747 }
748 }
749
750 #[inline(always)]
751 fn emit_atom(&mut self, atom: Atom) -> Result<(), Error> {
752 match self.sink_stack.last_mut() {
753 Some((sink, Container::Map(is_key, _))) => {
754 let key = *is_key;
755 *is_key = !key;
756 self.state.is_map_key = key;
757 if key {
758 sink.__private_key_atom(atom, &mut self.state)
759 } else {
760 sink.__private_value_atom(atom, &mut self.state)
761 }
762 }
763 Some((sink, Container::Seq(_))) => {
764 self.state.is_map_key = false;
765 sink.__private_value_atom(atom, &mut self.state)
766 }
767 Some((sink, Container::Inline(index))) => {
768 let item = *index;
769 *index = item.saturating_add(1);
770 self.state.is_map_key = false;
771 sink.__private_inline_atom(item as usize, atom, &mut self.state)
772 }
773 Some((sink, Container::Content(is_key, take, found))) => {
774 match content_atom(&self.state, is_key, take, found, &atom)? {
775 true => sink.atom(atom, &mut self.state),
776 false => Ok(()),
777 }
778 }
779 Some((_, Container::SkipValue)) => {
780 self.skip_value();
781 Ok(())
782 }
783 None => {
784 let sink = self.root.as_mut().expect("no active sink");
785 sink.atom(atom, &mut self.state)?;
786 sink.finish(&mut self.state)
787 }
788 }
789 }
790
791 #[inline(always)]
792 fn emit_start(&mut self, is_map: bool, shape: ContainerShape) -> Result<(), Error> {
793 let mut sink = match self.sink_stack.last_mut() {
794 Some((parent, Container::Map(is_key, _))) => {
795 let key = *is_key;
796 *is_key = !key;
797 self.state.is_map_key = key;
798 let sink = if key {
799 parent.next_key(&mut self.state)?
800 } else {
801 parent.next_value(&mut self.state)?
802 };
803 unsafe { erase_lifetime(sink) }
807 }
808 Some((parent, container @ Container::Seq(_))) => {
809 self.state.is_map_key = false;
810 if let (Container::Seq(true), false) = (*container, is_map) {
811 self.state.container_shape = shape;
813 parent.__private_inline_event(InlineEvent::Start, &mut self.state)?;
814 *container = Container::Inline(0);
815 self.state.is_multimap = false;
816 self.state.depth += 1;
817 return Ok(());
818 }
819 let sink = parent.next_value(&mut self.state)?;
820 unsafe { erase_lifetime(sink) }
822 }
823 Some((parent, Container::Inline(index))) => {
826 let item = *index;
827 *index = item.saturating_add(1);
828 self.state.is_map_key = false;
829 self.state.container_shape = shape;
830 let event = InlineEvent::Container(item as usize, is_map);
831 return parent.__private_inline_event(event, &mut self.state);
832 }
833 Some((_, Container::Content(is_key, take, _))) => {
835 if *is_key || *take {
836 return Err(content_container_error(*is_key));
837 }
838 *is_key = true;
839 self.state.is_map_key = false;
840 self.state.depth += 1;
841 self.sink_stack
842 .push((SinkHandle::null(), Container::new(is_map)));
843 return Ok(());
844 }
845 Some((_, container @ Container::SkipValue)) => {
847 self.state.is_map_key = false;
848 *container = Container::new(is_map);
849 self.state.depth += 1;
850 return Ok(());
851 }
852 None => self.root.take().expect("no active sink"),
853 };
854 self.state.container_shape = shape;
855 let container = if is_map {
856 match sink.map(&mut self.state) {
857 Ok(()) => Container::Map(true, shape.is_multimap()),
858 Err(err)
860 if err.kind() == ErrorKind::Unexpected
861 && ContentKey::of(&self.state).is_some() =>
862 {
863 Container::Content(true, false, false)
864 }
865 Err(err) => return Err(err),
866 }
867 } else {
868 Container::Seq(sink.__private_seq(&mut self.state)?)
869 };
870 self.state.is_multimap = container.is_multimap();
871 self.state.depth += 1;
872 self.sink_stack.push((sink, container));
873 Ok(())
874 }
875
876 #[inline(always)]
877 fn emit_end(&mut self, is_map: bool) -> Result<(), Error> {
878 match self.sink_stack.last() {
879 Some((_, Container::Map(..) | Container::Content(..))) if is_map => {}
880 Some((_, Container::Seq(_))) if !is_map => {}
881 Some((_, Container::Inline(_))) if !is_map => return self.end_inline(),
882 _ => panic!("not inside a {}", if is_map { "map" } else { "sequence" }),
883 }
884 let (mut sink, container) = self.sink_stack.pop().unwrap();
885 self.state.is_multimap = container.is_multimap();
889 let mut rv = Ok(());
890 if let Container::Content(_, _, false) = container {
892 self.state.is_map_key = false;
893 rv = sink
894 .atom(Atom::Lexical(Text::borrowed("")), &mut self.state)
895 .map_err(|err| match err.kind() {
896 ErrorKind::Unexpected => {
898 super::default_container(&mut sink, "map", &self.state).unwrap_err()
899 }
900 _ => err,
901 });
902 }
903 let rv = rv.and_then(|()| sink.finish(&mut self.state));
904 self.state.depth -= 1;
905 self.state.is_multimap = self
906 .sink_stack
907 .last()
908 .is_some_and(|(_, container)| container.is_multimap());
909 if self.sink_stack.is_empty() {
910 self.root = Some(sink);
912 } else {
913 sink.release(&mut self.state);
914 }
915 rv
916 }
917
918 #[inline(always)]
923 fn end_inline(&mut self) -> Result<(), Error> {
924 let (sink, container) = self.sink_stack.last_mut().unwrap();
925 let Container::Inline(len) = *container else {
926 unreachable!()
927 };
928 *container = Container::Seq(true);
929 self.state.is_multimap = false;
930 let rv = sink.__private_inline_event(InlineEvent::End(len as usize), &mut self.state);
931 self.state.depth -= 1;
932 rv
933 }
934}
935
936#[cold]
941#[inline(never)]
942fn content_atom(
943 state: &State,
944 is_key: &mut bool,
945 take: &mut bool,
946 found: &mut bool,
947 atom: &Atom<'_>,
948) -> Result<bool, Error> {
949 let was_key = *is_key;
950 *is_key = !was_key;
951 if was_key {
952 *take = match atom {
953 Atom::Str(key) | Atom::Lexical(key) => ContentKey::of(state) == Some(&**key),
954 _ => false,
955 };
956 return Ok(false);
957 }
958 if !core::mem::take(take) {
959 return Ok(false);
960 }
961 if core::mem::replace(found, true) {
962 return Err(Error::new(
963 ErrorKind::Unexpected,
964 "unexpected map with more than one content, expected a single value",
965 ));
966 }
967 Ok(true)
968}
969
970#[cold]
971fn content_container_error(is_key: bool) -> Error {
972 Error::new(
973 ErrorKind::Unexpected,
974 if is_key {
975 "unexpected map with a key that is not a single value, expected a single value"
976 } else {
977 "unexpected map whose content is not a single value, expected a single value"
978 },
979 )
980}
981
982impl<'de> DriverCore<'de> {
983 fn release(&mut self) {
985 while let Some((sink, _)) = self.sink_stack.pop() {
987 sink.release(&mut self.state);
988 }
989 if let Some(root) = self.root.take() {
992 root.release(&mut self.state);
993 }
994 let stack = core::mem::take(&mut self.sink_stack);
995 self.state.arena.put_vec(Buffer::SinkStack, stack);
996 }
997}
998
999impl<'de> Drop for DriverCore<'de> {
1000 fn drop(&mut self) {
1001 self.release();
1002 }
1003}
1004
1005#[test]
1006fn test_arena_is_not_orphaned() {
1007 use crate::de::Recording;
1008 use crate::de::arena::ORPHANED;
1009 use alloc::collections::BTreeMap;
1010 use alloc::string::String;
1011
1012 let orphaned = ORPHANED.with(|x| x.get());
1013 let mut out = None::<Vec<BTreeMap<String, Vec<u32>>>>;
1015 let mut driver = DeserializeDriver::new(&mut out);
1016 for event in [
1017 Event::seq_start(),
1018 Event::map_start(),
1019 "a".into(),
1020 Event::seq_start(),
1021 1u64.into(),
1022 Event::SeqEnd,
1023 Event::MapEnd,
1024 Event::SeqEnd,
1025 ] {
1026 driver.emit(event).unwrap();
1027 }
1028 drop(driver);
1029 assert_eq!(out.unwrap()[0]["a"], [1]);
1030
1031 let mut recording = Recording::new();
1033 let mut driver = DeserializeDriver::from_fn(|state| recording.recorder(state));
1034 for event in [Event::seq_start(), 1u64.into(), 2u64.into(), Event::SeqEnd] {
1035 driver.emit(event).unwrap();
1036 }
1037 drop(driver);
1038 let mut driver_out = None::<()>;
1039 let mut driver = DeserializeDriver::new(&mut driver_out);
1040 let mut out = None::<Vec<u32>>;
1041 let state = driver.state_mut();
1042 recording
1043 .replay(Vec::<u32>::deserialize_into(&mut out, state), state)
1044 .unwrap();
1045 drop(driver);
1046 assert_eq!(out.unwrap(), [1, 2]);
1047
1048 let mut out = None::<Vec<Vec<u32>>>;
1050 let mut driver = DeserializeDriver::new(&mut out);
1051 driver.emit(Event::seq_start()).unwrap();
1052 driver.emit(Event::seq_start()).unwrap();
1053 assert!(driver.emit("not a number").is_err());
1054 drop(driver);
1055
1056 assert_eq!(ORPHANED.with(|x| x.get()), orphaned);
1057}
1058
1059#[test]
1060fn test_sink_outlives_state() {
1061 use crate::de::OwnedSink;
1062 use crate::de::arena::ORPHANED;
1063 use alloc::collections::BTreeMap;
1064 use alloc::string::String;
1065
1066 let orphaned = ORPHANED.with(|x| x.get());
1069 let mut out = None::<Vec<BTreeMap<String, u32>>>;
1070 let mut driver = DeserializeDriver::from_sink(Vec::<BTreeMap<String, u32>>::deserialize_into(
1071 &mut out,
1072 &mut State::new(),
1073 ));
1074 assert_eq!(ORPHANED.with(|x| x.get()), orphaned + 1);
1075 for event in [
1076 Event::seq_start(),
1077 Event::map_start(),
1078 "a".into(),
1079 1u64.into(),
1080 Event::MapEnd,
1081 Event::SeqEnd,
1082 ] {
1083 driver.emit(event).unwrap();
1084 }
1085 drop(driver);
1086 assert_eq!(out.unwrap()[0]["a"], 1);
1087
1088 let mut driver_out = None::<()>;
1090 let mut driver = DeserializeDriver::new(&mut driver_out);
1091 let mut owned = OwnedSink::<Vec<u32>>::deserialize(driver.state_mut());
1092 drop(driver);
1093 assert_eq!(ORPHANED.with(|x| x.get()), orphaned + 2);
1094 let mut driver = DeserializeDriver::from_sink(SinkHandle::to(owned.borrow_mut()));
1095 for event in [Event::seq_start(), 1u64.into(), 2u64.into(), Event::SeqEnd] {
1096 driver.emit(event).unwrap();
1097 }
1098 drop(driver);
1099 assert_eq!(owned.take().unwrap(), [1, 2]);
1100 std::thread::spawn(move || drop(owned)).join().unwrap();
1102}
1103
1104#[test]
1105fn test_driver() {
1106 let mut out: Option<alloc::collections::BTreeMap<u32, String>> = None;
1107 {
1108 let mut driver = DeserializeDriver::new(&mut out);
1109 driver.emit(Event::map_start()).unwrap();
1110 driver.emit(1u64).unwrap();
1111 driver.emit("Hello").unwrap();
1112 driver.emit(2u64).unwrap();
1113 driver.emit("World").unwrap();
1114 driver.emit(Event::MapEnd).unwrap();
1115 }
1116
1117 let map = out.unwrap();
1118 assert_eq!(map[&1], "Hello");
1119 assert_eq!(map[&2], "World");
1120}