1use crate::State;
2use crate::de::{Deserialize, DeserializeDriver, Sink, SinkHandle};
3use crate::error::{Error, ErrorKind};
4use crate::event::{Atom, ContainerShape, Event};
5use crate::extensions::Snapshot;
6use crate::ser::{Chunk, MapEmitter, SeqEmitter, Serialize, SerializeHandle};
7use alloc::borrow::ToOwned;
8use alloc::boxed::Box;
9use alloc::vec::Vec;
10
11#[derive(Clone, Default)]
87pub struct Recording(RecordBuf<'static>);
88
89#[derive(Clone, Default)]
137pub struct RecordBuf<'de> {
138 events: Events<'de>,
139 is_map_key: bool,
140}
141
142#[derive(Clone)]
148enum Events<'de> {
149 Inline(Option<RecordedEvent<'de>>),
150 Heap(Vec<RecordedEvent<'de>>),
151}
152
153impl Default for Events<'_> {
154 fn default() -> Self {
155 Events::Inline(None)
156 }
157}
158
159impl<'de> Events<'de> {
160 #[inline]
161 fn as_slice(&self) -> &[RecordedEvent<'de>] {
162 match self {
163 Events::Inline(None) => &[],
164 Events::Inline(Some(event)) => core::slice::from_ref(event),
165 Events::Heap(events) => events,
166 }
167 }
168
169 #[inline]
170 fn as_mut_slice(&mut self) -> &mut [RecordedEvent<'de>] {
171 match self {
172 Events::Inline(None) => &mut [],
173 Events::Inline(Some(event)) => core::slice::from_mut(event),
174 Events::Heap(events) => events,
175 }
176 }
177
178 #[inline]
179 fn push(&mut self, event: RecordedEvent<'de>) {
180 match self {
181 Events::Inline(slot @ None) => *slot = Some(event),
182 Events::Heap(events) => events.push(event),
183 Events::Inline(Some(_)) => {
184 self.reserve(CONTAINER_CAPACITY);
185 if let Events::Heap(events) = self {
186 events.push(event);
187 }
188 }
189 }
190 }
191
192 #[inline]
193 fn clear(&mut self) {
194 match self {
195 Events::Inline(slot) => *slot = None,
196 Events::Heap(events) => events.clear(),
198 }
199 }
200
201 fn reserve(&mut self, additional: usize) {
204 match self {
205 Events::Inline(slot) => {
206 let mut events = Vec::with_capacity(additional + 1);
207 events.extend(slot.take());
208 *self = Events::Heap(events);
209 }
210 Events::Heap(events) => events.reserve(additional),
211 }
212 }
213}
214
215impl<'de> core::ops::Deref for Events<'de> {
216 type Target = [RecordedEvent<'de>];
217
218 #[inline]
219 fn deref(&self) -> &Self::Target {
220 self.as_slice()
221 }
222}
223
224impl core::fmt::Debug for Events<'_> {
225 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
226 core::fmt::Debug::fmt(self.as_slice(), f)
227 }
228}
229
230#[derive(Debug, Clone)]
231struct RecordedEvent<'de> {
232 event: Event<'de>,
233 borrowed: bool,
235 span: u32,
240 input_range: (usize, usize),
241 snapshot: Option<Box<Snapshot>>,
244}
245
246impl RecordedEvent<'_> {
247 fn restore(&self, state: &mut State) {
249 match self.snapshot {
250 Some(ref snapshot) => state.extensions_mut().restore(snapshot),
251 None => state.clear_event_data(),
253 }
254 }
255}
256
257#[cfg(target_pointer_width = "64")]
259const _: () = assert!(core::mem::size_of::<RecordedEvent<'static>>() == 64);
260
261const _: () = {
264 const fn assert_send<T: Send>() {}
265 assert_send::<Recording>();
266 assert_send::<RecordBuf<'static>>();
267};
268
269impl core::fmt::Debug for Recording {
270 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
271 f.debug_struct("Recording")
272 .field("events", &self.0.events)
273 .field("is_map_key", &self.0.is_map_key)
274 .finish()
275 }
276}
277
278impl core::fmt::Debug for RecordBuf<'_> {
279 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
280 f.debug_struct("RecordBuf")
281 .field("events", &self.events)
282 .field("is_map_key", &self.is_map_key)
283 .finish()
284 }
285}
286
287trait Target<'de>: Send {
291 fn push(&mut self, is_root: bool, event: Event<'static>, state: &State);
293
294 fn push_borrowed(&mut self, is_root: bool, atom: Atom<'de>, state: &State);
296
297 fn is_empty(&self) -> bool;
298
299 fn len(&self) -> usize;
301
302 fn close(&mut self, start: usize);
305
306 fn reserve(&mut self);
308}
309
310const CONTAINER_CAPACITY: usize = 16;
312
313impl<'de> Target<'de> for RecordBuf<'de> {
314 fn push(&mut self, is_root: bool, event: Event<'static>, state: &State) {
315 record(self, is_root, event, false, state);
316 }
317
318 fn push_borrowed(&mut self, is_root: bool, atom: Atom<'de>, state: &State) {
319 record(self, is_root, Event::Atom(atom), true, state);
320 }
321
322 fn is_empty(&self) -> bool {
323 self.events.is_empty()
324 }
325
326 fn len(&self) -> usize {
327 self.events.len()
328 }
329
330 fn close(&mut self, start: usize) {
331 close(self.events.as_mut_slice(), start);
332 }
333
334 fn reserve(&mut self) {
335 self.events.reserve(CONTAINER_CAPACITY);
336 }
337}
338
339impl<'de> Target<'de> for Recording {
340 fn push(&mut self, is_root: bool, event: Event<'static>, state: &State) {
341 record(&mut self.0, is_root, event, false, state);
342 }
343
344 fn push_borrowed(&mut self, is_root: bool, atom: Atom<'de>, state: &State) {
345 let event = Event::Atom(atom.to_static());
346 record(&mut self.0, is_root, event, false, state);
347 }
348
349 fn is_empty(&self) -> bool {
350 self.0.events.is_empty()
351 }
352
353 fn len(&self) -> usize {
354 self.0.events.len()
355 }
356
357 fn close(&mut self, start: usize) {
358 close(self.0.events.as_mut_slice(), start);
359 }
360
361 fn reserve(&mut self) {
362 self.0.events.reserve(CONTAINER_CAPACITY);
363 }
364}
365
366impl Recording {
367 pub fn new() -> Recording {
369 Recording::default()
370 }
371
372 pub fn recorder<'de>(&mut self, state: &mut State) -> SinkHandle<'_, 'de> {
376 self.0.events.clear();
377 self.0.is_map_key = false;
378 SinkHandle::arena(
379 Recorder {
380 target: self,
381 end: None,
382 start: 0,
383 is_root: true,
384 },
385 state,
386 )
387 }
388
389 pub fn capture<'a, 'de, F>(then: F, state: &mut State) -> SinkHandle<'a, 'de>
449 where
450 F: FnOnce(Recording, &mut State) -> Result<(), Error> + Send + 'a,
451 {
452 SinkHandle::arena(
453 CaptureSink {
454 recording: Recording::new(),
455 end: None,
456 then: Some(FnCapture(Some(then))),
457 },
458 state,
459 )
460 }
461
462 pub fn is_empty(&self) -> bool {
464 self.0.is_empty()
465 }
466
467 pub fn events(&self) -> impl Iterator<Item = &Event<'static>> {
469 self.0.events.iter().map(|recorded| &recorded.event)
470 }
471
472 pub fn as_str(&self) -> Option<&str> {
476 self.0.as_str()
477 }
478
479 pub fn replay<'de>(&self, sink: SinkHandle<'_, 'de>, state: &mut State) -> Result<(), Error> {
484 self.0.replay(sink, state)
485 }
486}
487
488impl<'de> RecordBuf<'de> {
489 pub fn new() -> RecordBuf<'de> {
491 RecordBuf::default()
492 }
493
494 pub fn recorder(&mut self, state: &mut State) -> SinkHandle<'_, 'de> {
498 self.events.clear();
499 self.is_map_key = false;
500 SinkHandle::arena(
501 Recorder {
502 target: self,
503 end: None,
504 start: 0,
505 is_root: true,
506 },
507 state,
508 )
509 }
510
511 pub fn capture<'a, F>(then: F, state: &mut State) -> SinkHandle<'a, 'de>
514 where
515 F: FnOnce(RecordBuf<'de>, &mut State) -> Result<(), Error> + Send + 'a,
516 'de: 'a,
517 {
518 RecordBuf::capture_with(FnCapture(Some(then)), state)
519 }
520
521 #[cfg_attr(not(feature = "derive"), allow(dead_code))]
526 pub(crate) fn capture_with<'a, C: Capture<'de, RecordBuf<'de>> + 'a>(
527 then: C,
528 state: &mut State,
529 ) -> SinkHandle<'a, 'de>
530 where
531 'de: 'a,
532 {
533 SinkHandle::arena(
534 CaptureSink {
535 recording: RecordBuf::new(),
536 end: None,
537 then: Some(then),
538 },
539 state,
540 )
541 }
542
543 #[cfg_attr(not(feature = "derive"), allow(dead_code))]
545 pub(crate) fn set_atom(&mut self, atom: &Atom<'_>, state: &State) {
546 self.events.clear();
547 self.is_map_key = false;
548 record(self, true, Event::Atom(atom.to_static()), false, state);
549 }
550
551 #[cfg_attr(not(feature = "derive"), allow(dead_code))]
553 pub(crate) fn offset(&self) -> Option<usize> {
554 self.events
555 .first()
556 .map(|x| x.input_range.0)
557 .filter(|&x| x != crate::state::NO_RANGE.0)
558 }
559
560 #[cfg_attr(not(feature = "derive"), allow(dead_code))]
565 pub(crate) fn attach_context(&self, err: Error, state: &mut State) -> Error {
566 let Some(first) = self.events.first() else {
567 return state.attach_error_context(err);
568 };
569 let live = state.extensions().snapshot();
570 let live_range = state.input_range;
571 state.input_range = first.input_range;
572 first.restore(state);
573 let err = state.attach_error_context(err);
574 state.extensions_mut().restore(&live);
575 state.input_range = live_range;
576 err
577 }
578
579 pub fn is_empty(&self) -> bool {
581 self.events.is_empty()
582 }
583
584 #[cfg_attr(not(feature = "derive"), allow(dead_code))]
586 pub(crate) fn single_atom(&self) -> Option<&Atom<'de>> {
587 match self.events.as_slice() {
588 [
589 RecordedEvent {
590 event: Event::Atom(atom),
591 ..
592 },
593 ] => Some(atom),
594 _ => None,
595 }
596 }
597
598 pub fn as_str(&self) -> Option<&str> {
600 self.single_atom()?.as_str()
601 }
602
603 pub fn replay<'a>(&self, sink: SinkHandle<'_, 'a>, state: &mut State) -> Result<(), Error>
607 where
608 'de: 'a,
609 {
610 let live = state.extensions().snapshot_if_any();
611 let live_range = state.input_range;
612 let rv = self.replay_events(sink, state);
613 match live {
614 Some(live) => state.extensions_mut().restore(&live),
615 None => state.clear_event_data(),
617 }
618 state.input_range = live_range;
619 rv
620 }
621
622 fn replay_events<'a>(&self, sink: SinkHandle<'_, 'a>, state: &mut State) -> Result<(), Error>
623 where
624 'de: 'a,
625 {
626 DeserializeDriver::nested(state, sink, self.is_map_key, |driver| {
627 for recorded in self.events.iter() {
628 let state = driver.state_mut();
629 state.input_range = recorded.input_range;
630 recorded.restore(state);
631 match recorded.event {
632 Event::Atom(ref atom) if recorded.borrowed => {
633 driver.emit_borrowed(Event::Atom(atom.clone()))?
634 }
635 ref event => driver.emit(event.as_borrowed())?,
636 }
637 }
638 Ok(())
639 })
640 }
641}
642
643fn record<'de>(
644 buf: &mut RecordBuf<'de>,
645 is_root: bool,
646 event: Event<'de>,
647 borrowed: bool,
648 state: &State,
649) {
650 if is_root && buf.events.is_empty() {
651 buf.is_map_key = state.is_map_key();
652 }
653 let recorded = RecordedEvent {
654 span: match event {
655 Event::Atom(_) => 1,
656 _ => 0,
657 },
658 event,
659 borrowed,
660 input_range: state.input_range,
661 snapshot: state.extensions().snapshot_if_any().map(Box::new),
662 };
663 match buf.events {
665 Events::Heap(ref mut events) => events.push(recorded),
666 ref mut events => events.push(recorded),
667 }
668}
669
670pub(crate) trait Capture<'de, T>: Send {
672 fn atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error>;
676
677 fn borrowed_atom(&mut self, atom: Atom<'de>, state: &mut State) -> Result<(), Error> {
679 self.atom(atom, state)
680 }
681
682 fn recorded(&mut self, recording: T, state: &mut State) -> Result<(), Error>;
684}
685
686struct FnCapture<F>(Option<F>);
688
689impl<'de, T, F> Capture<'de, T> for FnCapture<F>
690where
691 T: Target<'de> + Default,
692 F: FnOnce(T, &mut State) -> Result<(), Error> + Send,
693{
694 fn atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
695 let mut recording = T::default();
696 recording.push(true, Event::Atom(atom.to_static()), state);
697 self.recorded(recording, state)
698 }
699
700 fn borrowed_atom(&mut self, atom: Atom<'de>, state: &mut State) -> Result<(), Error> {
701 let mut recording = T::default();
702 recording.push_borrowed(true, atom, state);
703 self.recorded(recording, state)
704 }
705
706 fn recorded(&mut self, recording: T, state: &mut State) -> Result<(), Error> {
707 match self.0.take() {
708 Some(then) => then(recording, state),
709 None => Ok(()),
710 }
711 }
712}
713
714struct CaptureSink<T, C> {
716 recording: T,
717 end: Option<Event<'static>>,
718 then: Option<C>,
720}
721
722impl<'de, T, C> CaptureSink<T, C> {
723 fn child(&mut self, state: &mut State) -> SinkHandle<'_, 'de>
724 where
725 T: Target<'de>,
726 {
727 SinkHandle::arena(
728 Recorder {
729 target: &mut self.recording,
730 end: None,
731 start: 0,
732 is_root: false,
733 },
734 state,
735 )
736 }
737}
738
739impl<'de, T: Target<'de> + Default, C: Capture<'de, T>> Sink<'de> for CaptureSink<T, C> {
740 fn atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
741 match self.then.take() {
742 Some(mut then) => then.atom(atom, state),
743 None => Ok(()),
744 }
745 }
746
747 fn borrowed_atom(&mut self, atom: Atom<'de>, state: &mut State) -> Result<(), Error> {
748 match self.then.take() {
749 Some(mut then) => then.borrowed_atom(atom, state),
750 None => Ok(()),
751 }
752 }
753
754 fn map(&mut self, state: &mut State) -> Result<(), Error> {
755 let shape = state.container_shape();
756 self.recording.reserve();
758 self.recording.push(true, Event::MapStart(shape), state);
759 self.end = Some(Event::MapEnd);
760 Ok(())
761 }
762
763 fn seq(&mut self, state: &mut State) -> Result<(), Error> {
764 let shape = state.container_shape();
765 self.recording.reserve();
766 self.recording.push(true, Event::SeqStart(shape), state);
767 self.end = Some(Event::SeqEnd);
768 Ok(())
769 }
770
771 fn next_key(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
772 Ok(self.child(state))
773 }
774
775 fn next_value(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
776 Ok(self.child(state))
777 }
778
779 fn __private_key_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
782 self.recording
783 .push(false, Event::Atom(atom.to_static()), state);
784 Ok(())
785 }
786
787 fn __private_value_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
788 self.recording
789 .push(false, Event::Atom(atom.to_static()), state);
790 Ok(())
791 }
792
793 fn __private_borrowed_key_atom(
794 &mut self,
795 atom: Atom<'de>,
796 state: &mut State,
797 ) -> Result<(), Error> {
798 self.recording.push_borrowed(false, atom, state);
799 Ok(())
800 }
801
802 fn __private_borrowed_value_atom(
803 &mut self,
804 atom: Atom<'de>,
805 state: &mut State,
806 ) -> Result<(), Error> {
807 self.recording.push_borrowed(false, atom, state);
808 Ok(())
809 }
810
811 fn value_for_key(
815 &mut self,
816 key: &str,
817 state: &mut State,
818 ) -> Result<Option<SinkHandle<'_, 'de>>, Error> {
819 match self.end {
820 Some(Event::MapEnd) => {}
821 None if self.recording.is_empty() => {
822 self.recording
823 .push(true, Event::MapStart(ContainerShape::new()), state);
824 self.end = Some(Event::MapEnd);
825 }
826 _ => return Ok(None),
827 }
828 self.recording
829 .push(false, Event::Atom(Atom::Str(key.to_owned().into())), state);
830 Ok(Some(self.child(state)))
831 }
832
833 fn finish(&mut self, state: &mut State) -> Result<(), Error> {
834 let Some(mut then) = self.then.take() else {
836 return Ok(());
837 };
838 if self.recording.is_empty() && self.end.is_none() {
839 self.recording
841 .push(true, Event::MapStart(ContainerShape::new()), state);
842 self.end = Some(Event::MapEnd);
843 }
844 if let Some(end) = self.end.take() {
845 self.recording.push(true, end, state);
846 self.recording.close(0);
848 }
849 then.recorded(core::mem::take(&mut self.recording), state)
850 }
851}
852
853struct Recorder<'a, T> {
855 target: &'a mut T,
856 end: Option<Event<'static>>,
857 start: usize,
859 is_root: bool,
860}
861
862impl<'a, T> Recorder<'a, T> {
863 fn child<'de>(&mut self, state: &mut State) -> SinkHandle<'_, 'de>
864 where
865 T: Target<'de>,
866 {
867 SinkHandle::arena(
868 Recorder {
869 target: &mut *self.target,
870 end: None,
871 start: 0,
872 is_root: false,
873 },
874 state,
875 )
876 }
877}
878
879impl<'a, 'de, T: Target<'de>> Sink<'de> for Recorder<'a, T> {
880 fn atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
881 self.target
882 .push(self.is_root, Event::Atom(atom.to_static()), state);
883 Ok(())
884 }
885
886 fn borrowed_atom(&mut self, atom: Atom<'de>, state: &mut State) -> Result<(), Error> {
887 self.target.push_borrowed(self.is_root, atom, state);
888 Ok(())
889 }
890
891 fn map(&mut self, state: &mut State) -> Result<(), Error> {
892 self.start = self.target.len();
893 self.target.push(
894 self.is_root,
895 Event::MapStart(state.container_shape()),
896 state,
897 );
898 self.end = Some(Event::MapEnd);
899 Ok(())
900 }
901
902 fn seq(&mut self, state: &mut State) -> Result<(), Error> {
903 self.start = self.target.len();
904 self.target.push(
905 self.is_root,
906 Event::SeqStart(state.container_shape()),
907 state,
908 );
909 self.end = Some(Event::SeqEnd);
910 Ok(())
911 }
912
913 fn next_key(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
914 Ok(self.child(state))
915 }
916
917 fn next_value(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
918 Ok(self.child(state))
919 }
920
921 fn __private_key_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
924 self.target
925 .push(false, Event::Atom(atom.to_static()), state);
926 Ok(())
927 }
928
929 fn __private_value_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
930 self.target
931 .push(false, Event::Atom(atom.to_static()), state);
932 Ok(())
933 }
934
935 fn __private_borrowed_key_atom(
936 &mut self,
937 atom: Atom<'de>,
938 state: &mut State,
939 ) -> Result<(), Error> {
940 self.target.push_borrowed(false, atom, state);
941 Ok(())
942 }
943
944 fn __private_borrowed_value_atom(
945 &mut self,
946 atom: Atom<'de>,
947 state: &mut State,
948 ) -> Result<(), Error> {
949 self.target.push_borrowed(false, atom, state);
950 Ok(())
951 }
952 fn finish(&mut self, state: &mut State) -> Result<(), Error> {
953 if let Some(end) = self.end.take() {
954 self.target.push(self.is_root, end, state);
955 self.target.close(self.start);
956 }
957 Ok(())
958 }
959}
960
961impl PartialEq for Recording {
966 fn eq(&self, other: &Self) -> bool {
967 self.0.events.len() == other.0.events.len()
968 && self
969 .0
970 .events
971 .iter()
972 .zip(other.0.events.iter())
973 .all(|(a, b)| a.event == b.event)
974 }
975}
976
977impl<'de> Deserialize<'de> for Recording {
978 fn deserialize_into<'out>(
979 out: &'out mut Option<Self>,
980 state: &mut State,
981 ) -> SinkHandle<'out, 'de> {
982 Recording::capture(
983 move |recording, _state| {
984 *out = Some(recording);
985 Ok(())
986 },
987 state,
988 )
989 }
990}
991
992#[inline]
997fn value_len(events: &[RecordedEvent<'_>]) -> usize {
998 match events.first() {
999 Some(first) if first.span != 0 => first.span as usize,
1000 _ => scan_value_len(events),
1001 }
1002}
1003
1004#[cold]
1006fn scan_value_len(events: &[RecordedEvent<'_>]) -> usize {
1007 let mut depth = 0usize;
1008 for (index, recorded) in events.iter().enumerate() {
1009 match recorded.event {
1010 Event::MapStart(_) | Event::SeqStart(_) => depth += 1,
1011 Event::MapEnd | Event::SeqEnd => depth = depth.saturating_sub(1),
1012 Event::Atom(_) => {}
1013 }
1014 if depth == 0 {
1015 return index + 1;
1016 }
1017 }
1018 events.len()
1019}
1020
1021fn close(events: &mut [RecordedEvent<'_>], start: usize) {
1031 let Some((head, rest)) = events.get_mut(start..).and_then(|x| x.split_first_mut()) else {
1032 return;
1033 };
1034 head.span = u32::try_from(rest.len() + 1).unwrap_or(0);
1036 let is_map = match head.event {
1037 Event::MapStart(shape) if shape.len().is_none() => true,
1038 Event::SeqStart(shape) if shape.len().is_none() => false,
1039 _ => return,
1040 };
1041 let inner = &rest[..rest.len().saturating_sub(1)];
1042 let mut count = 0;
1043 let mut index = 0;
1044 while index < inner.len() {
1045 index += value_len(&inner[index..]);
1046 count += 1;
1047 }
1048 if let Event::MapStart(ref mut shape) | Event::SeqStart(ref mut shape) = head.event {
1049 *shape = shape.with_len(if is_map { count / 2 } else { count });
1050 }
1051}
1052
1053struct RecordedValue<'a, 'de>(&'a [RecordedEvent<'de>]);
1055
1056impl<'a, 'de> RecordedValue<'a, 'de> {
1057 fn chunk(&self, state: &mut State) -> Result<Chunk<'a>, Error> {
1058 let events = self.0;
1059 let (first, snapshot) = match events.first() {
1060 Some(first) => (&first.event, &first.snapshot),
1061 None => {
1062 return Err(Error::new(
1063 ErrorKind::Unexpected,
1064 "cannot serialize an empty recording",
1065 ));
1066 }
1067 };
1068 if let Some(snapshot) = snapshot {
1071 state.attach_event_data(snapshot.event_data());
1072 }
1073 let inner = events.get(1..events.len().saturating_sub(1)).unwrap_or(&[]);
1074 Ok(match first {
1075 Event::Atom(atom) => Chunk::Atom(atom.as_borrowed()),
1076 Event::MapStart(_) => Chunk::map(
1077 RecordedEmitter {
1078 rest: inner,
1079 current: RecordedValue(&[]),
1080 },
1081 state,
1082 ),
1083 Event::SeqStart(_) => Chunk::seq(
1084 RecordedEmitter {
1085 rest: inner,
1086 current: RecordedValue(&[]),
1087 },
1088 state,
1089 ),
1090 Event::MapEnd | Event::SeqEnd => {
1091 return Err(Error::new(ErrorKind::Unexpected, "malformed recording"));
1092 }
1093 })
1094 }
1095
1096 fn container_shape(&self) -> ContainerShape {
1097 match self.0.first().map(|x| &x.event) {
1098 Some(Event::MapStart(shape) | Event::SeqStart(shape)) => *shape,
1099 _ => ContainerShape::new(),
1100 }
1101 }
1102
1103 fn is_optional(&self) -> bool {
1104 matches!(
1105 self.0,
1106 [RecordedEvent {
1107 event: Event::Atom(Atom::Null),
1108 ..
1109 }]
1110 )
1111 }
1112}
1113
1114impl Serialize for RecordedValue<'_, '_> {
1115 fn serialize(&self, state: &mut State) -> Result<Chunk<'_>, Error> {
1116 self.chunk(state)
1117 }
1118
1119 fn container_shape(&self) -> ContainerShape {
1120 RecordedValue::container_shape(self)
1121 }
1122}
1123
1124struct RecordedEmitter<'a, 'de> {
1126 rest: &'a [RecordedEvent<'de>],
1127 current: RecordedValue<'a, 'de>,
1128}
1129
1130impl RecordedEmitter<'_, '_> {
1131 fn next_value(&mut self) -> Option<SerializeHandle<'_>> {
1132 if self.rest.is_empty() {
1133 return None;
1134 }
1135 let len = value_len(self.rest);
1136 let (value, rest) = self.rest.split_at(len);
1137 self.current = RecordedValue(value);
1138 self.rest = rest;
1139 Some(SerializeHandle::to(&self.current))
1140 }
1141}
1142
1143impl SeqEmitter for RecordedEmitter<'_, '_> {
1144 fn next(&mut self, _state: &mut State) -> Result<Option<SerializeHandle<'_>>, Error> {
1145 Ok(self.next_value())
1146 }
1147}
1148
1149impl MapEmitter for RecordedEmitter<'_, '_> {
1150 fn next_key(&mut self, _state: &mut State) -> Result<Option<SerializeHandle<'_>>, Error> {
1151 Ok(self.next_value())
1152 }
1153
1154 fn next_value(&mut self, _state: &mut State) -> Result<SerializeHandle<'_>, Error> {
1155 RecordedEmitter::next_value(self)
1156 .ok_or_else(|| Error::new(ErrorKind::Unexpected, "malformed recording"))
1157 }
1158}
1159
1160impl Serialize for Recording {
1161 fn serialize(&self, state: &mut State) -> Result<Chunk<'_>, Error> {
1162 RecordedValue(self.0.events.as_slice()).chunk(state)
1163 }
1164
1165 fn container_shape(&self) -> ContainerShape {
1166 RecordedValue(self.0.events.as_slice()).container_shape()
1167 }
1168
1169 fn is_optional(&self) -> bool {
1170 RecordedValue(self.0.events.as_slice()).is_optional()
1171 }
1172}
1173
1174impl Serialize for RecordBuf<'_> {
1177 fn serialize(&self, state: &mut State) -> Result<Chunk<'_>, Error> {
1178 RecordedValue(self.events.as_slice()).chunk(state)
1179 }
1180
1181 fn container_shape(&self) -> ContainerShape {
1182 RecordedValue(self.events.as_slice()).container_shape()
1183 }
1184
1185 fn is_optional(&self) -> bool {
1186 RecordedValue(self.events.as_slice()).is_optional()
1187 }
1188}
1189
1190impl<'de> Deserialize<'de> for RecordBuf<'de> {
1193 fn deserialize_into<'out>(
1194 out: &'out mut Option<Self>,
1195 state: &mut State,
1196 ) -> SinkHandle<'out, 'de> {
1197 RecordBuf::capture(
1198 move |buf, _state| {
1199 *out = Some(buf);
1200 Ok(())
1201 },
1202 state,
1203 )
1204 }
1205}