1use alloc::format;
2use alloc::string::String;
3use alloc::string::ToString;
4use alloc::sync::Arc;
5use alloc::vec::Vec;
6use core::marker::PhantomData;
7
8use deser_core::Text;
9use deser_core::de::{
10 self, Deserialize, DeserializeDriver, Frame, LexicalRules, deserialize_value,
11};
12use deser_core::{Atom, Bytes, ContainerShape, Error, ErrorKind, Event, Source, TrackLocations};
13
14use crate::parser::{Dialect, Field, Options, QUOTED, Scan, Scanner, UNESCAPE, unescape};
15use crate::{Escape, Headers, Nulls, Terminator, Trim};
16
17#[derive(Debug, Clone, PartialEq, Eq)]
37pub struct DeserializerConfig {
38 pub(crate) delimiter: u8,
39 pub(crate) quote: Option<u8>,
40 pub(crate) double_quote: bool,
41 pub(crate) escape: Escape,
42 pub(crate) terminator: Terminator,
43 pub(crate) comment: Option<u8>,
44 pub(crate) headers: Headers,
45 pub(crate) trim: Trim,
46 pub(crate) nulls: Nulls,
47 pub(crate) skip_blank_lines: bool,
48 pub(crate) flexible: bool,
49 pub(crate) lenient_quotes: bool,
50 pub(crate) sep_line: bool,
51 pub(crate) max_record_len: usize,
52
53 context: deser_core::Context,
54}
55
56impl Default for DeserializerConfig {
57 fn default() -> DeserializerConfig {
58 DeserializerConfig::new()
59 }
60}
61
62impl DeserializerConfig {
63 pub const fn new() -> DeserializerConfig {
65 DeserializerConfig {
66 delimiter: b',',
67 quote: Some(b'"'),
68 double_quote: true,
69 escape: Escape::None,
70 terminator: Terminator::Newline,
71 comment: None,
72 headers: Headers::First,
73 trim: Trim::None,
74 nulls: Nulls::None,
75 skip_blank_lines: true,
76 flexible: false,
77 lenient_quotes: false,
78 sep_line: false,
79 max_record_len: 64 * 1024 * 1024,
80
81 context: deser_core::Context::new(),
82 }
83 }
84
85 pub const fn builder() -> DeserializerConfigBuilder {
87 DeserializerConfigBuilder::new()
88 }
89
90 pub const fn into_builder(self) -> DeserializerConfigBuilder {
92 DeserializerConfigBuilder { value: self }
93 }
94
95 pub fn set_context(&mut self, context: deser_core::Context) {
103 self.context = context;
104 }
105
106 pub fn context(&self) -> &deser_core::Context {
108 &self.context
109 }
110
111 pub const fn tsv() -> DeserializerConfig {
139 let mut config = DeserializerConfig::new();
140 config.set_delimiter(b'\t');
141 config.set_quote(None);
142 config.set_escape(Escape::Backslash);
143 config.set_nulls(Nulls::Text("\\N"));
144 config
145 }
146
147 pub const fn set_delimiter(&mut self, delimiter: u8) {
152 self.delimiter = delimiter;
153 }
154
155 pub const fn set_quote(&mut self, quote: Option<u8>) {
160 self.quote = quote;
161 }
162
163 pub const fn set_double_quote(&mut self, yes: bool) {
169 self.double_quote = yes;
170 }
171
172 pub const fn set_escape(&mut self, escape: Escape) {
174 self.escape = escape;
175 }
176
177 pub const fn set_terminator(&mut self, terminator: Terminator) {
179 self.terminator = terminator;
180 }
181
182 pub const fn set_comment(&mut self, comment: Option<u8>) {
187 self.comment = comment;
188 }
189
190 pub const fn set_headers(&mut self, headers: Headers) {
196 self.headers = headers;
197 }
198
199 pub const fn set_trim(&mut self, trim: Trim) {
204 self.trim = trim;
205 }
206
207 pub const fn set_nulls(&mut self, nulls: Nulls) {
213 self.nulls = nulls;
214 }
215
216 pub const fn set_skip_blank_lines(&mut self, yes: bool) {
221 self.skip_blank_lines = yes;
222 }
223
224 pub const fn set_flexible(&mut self, yes: bool) {
233 self.flexible = yes;
234 }
235
236 pub const fn set_lenient_quotes(&mut self, yes: bool) {
244 self.lenient_quotes = yes;
245 }
246
247 pub const fn set_sep_line(&mut self, yes: bool) {
262 self.sep_line = yes;
263 }
264
265 pub const fn set_max_record_len(&mut self, len: usize) {
273 self.max_record_len = len;
274 }
275
276 pub fn from_str<'de, T: Deserialize<'de>>(&self, s: &'de str) -> Result<T, Error> {
280 deserialize_value(|driver| self.drive_str(s, driver))
281 }
282
283 fn drive_str<'de>(
286 &self,
287 s: &'de str,
288 driver: &mut DeserializeDriver<'_, 'de>,
289 ) -> Result<(), Error> {
290 de::Deserializer::drive(
291 &mut Deserializer::from_str_with_config(s, self.clone()),
292 driver,
293 )
294 }
295
296 pub fn from_slice<'de, T: Deserialize<'de>>(&self, bytes: &'de [u8]) -> Result<T, Error> {
300 deserialize_value(|driver| self.drive_slice(bytes, driver))
301 }
302
303 fn drive_slice<'de>(
306 &self,
307 bytes: &'de [u8],
308 driver: &mut DeserializeDriver<'_, 'de>,
309 ) -> Result<(), Error> {
310 de::Deserializer::drive(
311 &mut Deserializer::from_slice_with_config(bytes, self.clone()),
312 driver,
313 )
314 }
315
316 fn options(&self, header: bool) -> Options {
318 Options {
319 trim: match self.trim {
320 Trim::None => false,
321 Trim::Headers => header,
322 Trim::Fields => !header,
323 Trim::All => true,
324 },
325 skip_blank_lines: self.skip_blank_lines,
326 lenient_quotes: self.lenient_quotes,
327 max_record_len: self.max_record_len,
328 }
329 }
330
331 fn dialect(&self, delimiter: u8) -> Result<Dialect, Error> {
332 Dialect::new(
333 delimiter,
334 self.quote,
335 self.double_quote,
336 self.escape,
337 self.terminator,
338 self.comment,
339 )
340 }
341}
342
343#[derive(Debug, Clone)]
347#[must_use]
348pub struct DeserializerConfigBuilder {
349 value: DeserializerConfig,
350}
351
352impl DeserializerConfigBuilder {
353 pub const fn new() -> DeserializerConfigBuilder {
355 DeserializerConfigBuilder {
356 value: DeserializerConfig::new(),
357 }
358 }
359
360 pub const fn delimiter(mut self, delimiter: u8) -> DeserializerConfigBuilder {
364 self.value.set_delimiter(delimiter);
365 self
366 }
367
368 pub const fn quote(mut self, quote: Option<u8>) -> DeserializerConfigBuilder {
372 self.value.set_quote(quote);
373 self
374 }
375
376 pub const fn double_quote(mut self, yes: bool) -> DeserializerConfigBuilder {
380 self.value.set_double_quote(yes);
381 self
382 }
383
384 pub const fn escape(mut self, escape: Escape) -> DeserializerConfigBuilder {
388 self.value.set_escape(escape);
389 self
390 }
391
392 pub const fn terminator(mut self, terminator: Terminator) -> DeserializerConfigBuilder {
396 self.value.set_terminator(terminator);
397 self
398 }
399
400 pub const fn comment(mut self, comment: Option<u8>) -> DeserializerConfigBuilder {
404 self.value.set_comment(comment);
405 self
406 }
407
408 pub const fn headers(mut self, headers: Headers) -> DeserializerConfigBuilder {
412 self.value.set_headers(headers);
413 self
414 }
415
416 pub const fn trim(mut self, trim: Trim) -> DeserializerConfigBuilder {
420 self.value.set_trim(trim);
421 self
422 }
423
424 pub const fn nulls(mut self, nulls: Nulls) -> DeserializerConfigBuilder {
428 self.value.set_nulls(nulls);
429 self
430 }
431
432 pub const fn skip_blank_lines(mut self, yes: bool) -> DeserializerConfigBuilder {
436 self.value.set_skip_blank_lines(yes);
437 self
438 }
439
440 pub const fn flexible(mut self, yes: bool) -> DeserializerConfigBuilder {
444 self.value.set_flexible(yes);
445 self
446 }
447
448 pub const fn lenient_quotes(mut self, yes: bool) -> DeserializerConfigBuilder {
452 self.value.set_lenient_quotes(yes);
453 self
454 }
455
456 pub const fn sep_line(mut self, yes: bool) -> DeserializerConfigBuilder {
460 self.value.set_sep_line(yes);
461 self
462 }
463
464 pub const fn max_record_len(mut self, len: usize) -> DeserializerConfigBuilder {
468 self.value.set_max_record_len(len);
469 self
470 }
471
472 pub fn context(mut self, context: deser_core::Context) -> DeserializerConfigBuilder {
476 self.value.set_context(context);
477 self
478 }
479
480 pub const fn build(self) -> DeserializerConfig {
482 let value = unsafe { core::ptr::read(&self.value) };
486 core::mem::forget(self);
487 value
488 }
489}
490
491impl Default for DeserializerConfigBuilder {
492 fn default() -> DeserializerConfigBuilder {
493 DeserializerConfigBuilder::new()
494 }
495}
496
497#[derive(Debug, Default)]
502pub(crate) struct StreamState {
503 dialect: Option<Dialect>,
505 scanner: Scanner,
506 names: Option<Vec<String>>,
507 has_names: bool,
509 expected_len: Option<usize>,
511 scratch: Vec<u8>,
513}
514
515impl StreamState {
516 pub(crate) fn with_headers(names: Vec<String>) -> StreamState {
519 StreamState {
520 names: Some(names),
521 has_names: true,
522 ..StreamState::default()
523 }
524 }
525
526 pub(crate) fn headers(&self) -> Option<&[String]> {
528 self.names.as_deref()
529 }
530
531 pub(crate) fn frame(
538 &mut self,
539 config: &DeserializerConfig,
540 input: &[u8],
541 eof: bool,
542 ) -> Result<Frame, Error> {
543 if self.dialect.is_none() {
544 match self.start(config, input, eof)? {
545 Frame::Incomplete { consumed: 0 } if self.dialect.is_some() => {}
546 frame => return Ok(frame),
547 }
548 }
549 let dialect = self.dialect.as_ref().unwrap();
550 let header = !self.has_names;
551 let options = config.options(header);
552 match self.scanner.scan(dialect, input, eof, options)? {
553 Scan::Record { end, consumed } => {
554 if header {
555 self.read_names(input)?;
556 return Ok(Frame::Incomplete { consumed });
557 }
558 if self.names.is_none() && self.expected_len.is_none() {
559 self.expected_len = Some(self.scanner.fields.len());
560 }
561 Ok(Frame::Value {
562 start: 0,
563 end,
564 consumed,
565 })
566 }
567 Scan::Skip { consumed } => Ok(Frame::Incomplete { consumed }),
568 Scan::Incomplete => Ok(Frame::Incomplete { consumed: 0 }),
569 Scan::End => Ok(Frame::End),
570 }
571 }
572
573 fn start(
576 &mut self,
577 config: &DeserializerConfig,
578 input: &[u8],
579 eof: bool,
580 ) -> Result<Frame, Error> {
581 const BOM: &[u8] = b"\xef\xbb\xbf";
582 const SEP: &[u8] = b"sep=";
583 let partial = |bom: &[u8]| input.len() < bom.len() && bom.starts_with(input);
586 if !eof && (partial(BOM) || partial(b"\xff\xfe") || partial(b"\xfe\xff")) {
587 return Ok(Frame::Incomplete { consumed: 0 });
588 }
589 if input.starts_with(b"\xff\xfe") || input.starts_with(b"\xfe\xff") {
590 return Err(Error::with_offset(
591 ErrorKind::Syntax,
592 "input is UTF-16, only UTF-8 is supported",
593 0,
594 ));
595 }
596 let bom = if input.starts_with(BOM) { BOM.len() } else { 0 };
597 let rest = &input[bom..];
598 let prefix = rest.len().min(SEP.len());
599 if !config.sep_line || !rest[..prefix].eq_ignore_ascii_case(&SEP[..prefix]) {
600 return self.started(config, config.delimiter, bom);
601 }
602 let end = match rest.iter().position(|&b| b == b'\n' || b == b'\r') {
604 Some(end) if rest[end] == b'\r' && end + 1 == rest.len() && !eof => {
605 return Ok(Frame::Incomplete { consumed: 0 });
606 }
607 Some(end) => end,
608 None if eof => rest.len(),
609 None => return Ok(Frame::Incomplete { consumed: 0 }),
610 };
611 if end != SEP.len() + 1 {
612 return self.started(config, config.delimiter, bom);
613 }
614 let mut consumed = bom + end + 1;
615 if rest.get(end) == Some(&b'\r') && rest.get(end + 1) == Some(&b'\n') {
616 consumed += 1;
617 }
618 self.started(config, rest[SEP.len()], consumed.min(input.len()))
619 }
620
621 fn started(
622 &mut self,
623 config: &DeserializerConfig,
624 delimiter: u8,
625 consumed: usize,
626 ) -> Result<Frame, Error> {
627 self.dialect = Some(config.dialect(delimiter)?);
628 if !self.has_names {
629 match config.headers {
630 Headers::First | Headers::Skip => {}
631 Headers::None => self.has_names = true,
632 Headers::Given(names) => {
633 self.names = Some(names.iter().map(|name| name.to_string()).collect());
634 self.has_names = true;
635 }
636 }
637 }
638 Ok(Frame::Incomplete { consumed })
639 }
640
641 fn read_names(&mut self, record: &[u8]) -> Result<(), Error> {
643 if let Some((offset, msg)) = self.scanner.error {
644 return Err(Error::with_offset(ErrorKind::Syntax, msg, offset));
645 }
646 let dialect = self.dialect.as_ref().unwrap();
647 let mut names = Vec::with_capacity(self.scanner.fields.len());
648 for field in &self.scanner.fields {
649 let text = &record[field.start..field.end];
650 let text = if field.flags & UNESCAPE != 0 {
651 unescape(dialect, text, field.flags & QUOTED != 0, &mut self.scratch);
652 &self.scratch[..]
653 } else {
654 text
655 };
656 match core::str::from_utf8(text) {
657 Ok(name) => names.push(name.to_string()),
658 Err(_) => {
659 return Err(Error::with_offset(
660 ErrorKind::Syntax,
661 "name is not valid UTF-8",
662 field.span_start,
663 ));
664 }
665 }
666 }
667 self.names = Some(names);
668 self.has_names = true;
669 Ok(())
670 }
671
672 pub(crate) fn emit_record<'de>(
678 &mut self,
679 config: &DeserializerConfig,
680 record: &'de [u8],
681 base: usize,
682 utf8: bool,
683 driver: &mut DeserializeDriver<'_, 'de>,
684 ) -> Result<(), Error> {
685 let StreamState {
686 ref dialect,
687 ref scanner,
688 ref names,
689 expected_len,
690 ref mut scratch,
691 ..
692 } = *self;
693 let self_names_len = names.as_ref().map(Vec::len);
694 let dialect = dialect
695 .as_ref()
696 .expect("records are emitted after the start");
697 if let Some((offset, msg)) = scanner.error {
698 return Err(Error::with_offset(ErrorKind::Syntax, msg, base + offset));
699 }
700 LexicalRules::LENIENT.set_default(driver.state_mut());
703 let fields = &scanner.fields[..];
704 let names = match config.headers {
706 Headers::Skip => None,
707 _ => names.as_ref(),
708 };
709 let expected = match (names, self_names_len) {
710 (Some(names), _) => names.len(),
711 (None, Some(len)) => len,
712 (None, None) => expected_len.unwrap_or(fields.len()),
713 };
714 if fields.len() != expected && !config.flexible {
715 return Err(Error::with_offset(
716 ErrorKind::Syntax,
717 format!(
718 "record has {} field{}, expected {}",
719 fields.len(),
720 if fields.len() == 1 { "" } else { "s" },
721 expected
722 ),
723 base,
724 ));
725 }
726
727 let mut shape = ContainerShape::with_len(fields.len());
728 let emitter = FieldEmitter {
729 dialect,
730 nulls: config.nulls,
731 record,
732 record_is_utf8: utf8 || record.is_ascii() || core::str::from_utf8(record).is_ok(),
735 base,
736 };
737 let end = base + record.len();
740 driver.state_mut().set_input_range(base, base);
741 match names {
742 Some(names) => {
743 shape.set_multimap(true);
745 driver.emit(Event::MapStart(shape))?;
746 for (index, field) in fields.iter().enumerate() {
747 emitter.set_range(driver, field);
748 match names.get(index) {
749 Some(name) => driver.emit(Atom::Lexical(Text::borrowed(name.as_str())))?,
752 None => driver.emit(Atom::Lexical(Text::owned(index.to_string())))?,
753 }
754 emitter.emit(driver, field, scratch)?;
755 }
756 driver.state_mut().set_input_range(end, end);
757 driver.emit(Event::MapEnd)
758 }
759 None => {
760 driver.emit(Event::SeqStart(shape))?;
761 for field in fields {
762 emitter.emit(driver, field, scratch)?;
763 }
764 driver.state_mut().set_input_range(end, end);
765 driver.emit(Event::SeqEnd)
766 }
767 }
768 }
769}
770
771struct FieldEmitter<'a, 'de> {
773 dialect: &'a Dialect,
774 nulls: Nulls,
775 record: &'de [u8],
776 record_is_utf8: bool,
777 base: usize,
778}
779
780impl<'de> FieldEmitter<'_, 'de> {
781 #[inline]
782 fn set_range(&self, driver: &mut DeserializeDriver<'_, 'de>, field: &Field) {
783 driver
784 .state_mut()
785 .set_input_range(self.base + field.span_start, self.base + field.span_end);
786 }
787
788 #[inline]
789 fn emit(
790 &self,
791 driver: &mut DeserializeDriver<'_, 'de>,
792 field: &Field,
793 scratch: &mut Vec<u8>,
794 ) -> Result<(), Error> {
795 self.set_range(driver, field);
796 let text = &self.record[field.start..field.end];
797 if field.flags & QUOTED == 0 {
798 match self.nulls {
799 Nulls::Empty if text.is_empty() => return driver.emit(Atom::Null),
800 Nulls::Text(null) if text == null.as_bytes() => return driver.emit(Atom::Null),
801 _ => {}
802 }
803 }
804 if field.flags & UNESCAPE != 0 {
805 unescape(self.dialect, text, field.flags & QUOTED != 0, scratch);
806 match core::str::from_utf8(scratch) {
808 Ok(text) => driver.emit(Atom::Lexical(Text::borrowed(text))),
809 Err(_) => driver.emit(Atom::Bytes(Bytes::borrowed(scratch))),
810 }
811 } else if self.record_is_utf8 {
812 let text = unsafe { core::str::from_utf8_unchecked(text) };
815 driver.emit_borrowed(Atom::Lexical(Text::borrowed(text)))
816 } else {
817 match core::str::from_utf8(text) {
818 Ok(text) => driver.emit_borrowed(Atom::Lexical(Text::borrowed(text))),
819 Err(_) => driver.emit_borrowed(Atom::Bytes(Bytes::borrowed(text))),
820 }
821 }
822 }
823}
824
825pub struct Deserializer<'a> {
854 input: &'a [u8],
855 utf8: bool,
857 pos: usize,
858 config: DeserializerConfig,
859 state: StreamState,
860 failed: bool,
861 source: Option<Arc<str>>,
863}
864
865impl<'a> Deserializer<'a> {
866 #[allow(clippy::should_implement_trait)]
868 pub fn from_str(input: &'a str) -> Deserializer<'a> {
869 Deserializer::from_str_with_config(input, DeserializerConfig::new())
870 }
871
872 pub fn from_str_with_config(input: &'a str, config: DeserializerConfig) -> Deserializer<'a> {
874 Deserializer::new(input.as_bytes(), true, config)
875 }
876
877 pub fn from_slice(input: &'a [u8]) -> Deserializer<'a> {
881 Deserializer::from_slice_with_config(input, DeserializerConfig::new())
882 }
883
884 pub fn from_slice_with_config(input: &'a [u8], config: DeserializerConfig) -> Deserializer<'a> {
887 Deserializer::new(input, false, config)
888 }
889
890 fn new(input: &'a [u8], utf8: bool, config: DeserializerConfig) -> Deserializer<'a> {
891 Deserializer {
892 input,
893 utf8,
894 pos: 0,
895 config,
896 state: StreamState::default(),
897 failed: false,
898 source: None,
899 }
900 }
901
902 pub fn config(&self) -> &DeserializerConfig {
904 &self.config
905 }
906
907 pub fn headers(&self) -> Option<&[String]> {
911 self.state.headers()
912 }
913
914 pub fn is_end(&self) -> bool {
920 self.failed || self.pos == self.input.len()
921 }
922
923 pub fn deserialize<T: Deserialize<'a>>(&mut self) -> Result<T, Error> {
928 de::Deserializer::deserialize(self)
929 }
930
931 pub fn deserialize_with<T, F>(&mut self, setup: F) -> Result<T, Error>
936 where
937 T: Deserialize<'a>,
938 F: FnOnce(&mut DeserializeDriver<'_, 'a>),
939 {
940 de::Deserializer::deserialize_with(self, setup)
941 }
942
943 pub fn deserialize_record<T: Deserialize<'a>>(&mut self) -> Result<Option<T>, Error> {
965 self.deserialize_record_with(|_| {})
966 }
967
968 pub fn deserialize_record_with<T, F>(&mut self, setup: F) -> Result<Option<T>, Error>
972 where
973 T: Deserialize<'a>,
974 F: FnOnce(&mut DeserializeDriver<'_, 'a>),
975 {
976 let mut out = None;
977 {
978 let mut driver = DeserializeDriver::new(&mut out);
979 setup(&mut driver);
980 if !self.drive_record(&mut driver)? {
981 return Ok(None);
982 }
983 }
984 out.ok_or_else(|| Error::new(ErrorKind::EndOfFile, "empty record"))
985 .map(Some)
986 }
987
988 pub fn records<T: Deserialize<'a>>(&mut self) -> Records<'_, 'a, T> {
993 Records {
994 de: self,
995 _marker: PhantomData,
996 }
997 }
998
999 pub fn drive_record(&mut self, driver: &mut DeserializeDriver<'_, 'a>) -> Result<bool, Error> {
1003 if !self.config.context.is_empty() {
1004 driver.set_default_context(self.config.context.clone());
1005 }
1006 let rv = self.drive_record_impl(driver);
1007 rv.map_err(|mut err| {
1008 err.resolve_position(self.input);
1009 err
1010 })
1011 }
1012
1013 fn drive_record_impl(&mut self, driver: &mut DeserializeDriver<'_, 'a>) -> Result<bool, Error> {
1014 let Some((start, end)) = self.next_record()? else {
1015 return Ok(false);
1016 };
1017 let input = self.input;
1018 self.set_source(driver);
1019 self.state
1020 .emit_record(&self.config, &input[start..end], start, self.utf8, driver)?;
1021 Ok(true)
1022 }
1023
1024 fn set_source(&mut self, driver: &mut DeserializeDriver<'_, 'a>) {
1026 if TrackLocations::of(driver.state()) {
1027 let input = self.input;
1028 let source = self
1029 .source
1030 .get_or_insert_with(|| String::from_utf8_lossy(input).into());
1031 Source(source.clone()).set(driver.state_mut());
1032 }
1033 }
1034
1035 fn next_record(&mut self) -> Result<Option<(usize, usize)>, Error> {
1037 if self.failed {
1038 return Ok(None);
1039 }
1040 loop {
1041 let input = &self.input[self.pos..];
1042 let frame = match self.state.frame(&self.config, input, true) {
1043 Ok(frame) => frame,
1044 Err(err) => {
1045 self.failed = true;
1047 return Err(err.shift_offset(self.pos));
1048 }
1049 };
1050 match frame {
1051 Frame::Value {
1052 start,
1053 end,
1054 consumed,
1055 } => {
1056 let range = (self.pos + start, self.pos + end);
1057 self.pos += consumed;
1058 return Ok(Some(range));
1059 }
1060 Frame::Incomplete { consumed } => self.pos += consumed,
1061 Frame::End => return Ok(None),
1062 }
1063 }
1064 }
1065
1066 pub fn drive(&mut self, driver: &mut DeserializeDriver<'_, 'a>) -> Result<(), Error> {
1077 if !self.config.context.is_empty() {
1078 driver.set_default_context(self.config.context.clone());
1079 }
1080 let rv = self.drive_impl(driver);
1081 rv.map_err(|mut err| {
1082 err.resolve_position(self.input);
1083 err
1084 })
1085 }
1086
1087 fn drive_impl(&mut self, driver: &mut DeserializeDriver<'_, 'a>) -> Result<(), Error> {
1088 self.set_source(driver);
1089 let input = self.input;
1090 let mut next = self.next_record()?;
1093 let shape = match next {
1094 Some((start, _)) => {
1095 let mut shape = ContainerShape::new();
1096 shape.set_len_hint((input.len() - start) / (self.pos - start).max(1));
1097 shape
1098 }
1099 None => ContainerShape::new(),
1100 };
1101 driver.emit(Event::SeqStart(shape))?;
1102 while let Some((start, end)) = next {
1103 self.state
1104 .emit_record(&self.config, &input[start..end], start, self.utf8, driver)?;
1105 next = self.next_record()?;
1106 }
1107 driver.emit(Event::SeqEnd)
1108 }
1109}
1110
1111impl<'a> de::Deserializer<'a> for Deserializer<'a> {
1112 fn drive(&mut self, driver: &mut DeserializeDriver<'_, 'a>) -> Result<(), Error> {
1113 Deserializer::drive(self, driver)
1114 }
1115}
1116
1117pub struct Records<'d, 'a, T> {
1121 de: &'d mut Deserializer<'a>,
1122 _marker: PhantomData<fn() -> T>,
1123}
1124
1125impl<'a, T: Deserialize<'a>> Iterator for Records<'_, 'a, T> {
1126 type Item = Result<T, Error>;
1127
1128 fn next(&mut self) -> Option<Self::Item> {
1129 self.de.deserialize_record().transpose()
1130 }
1131}
1132
1133trait ShiftOffset {
1135 fn shift_offset(self, base: usize) -> Self;
1136}
1137
1138impl ShiftOffset for Error {
1139 fn shift_offset(mut self, base: usize) -> Error {
1140 if let Some(offset) = self.offset() {
1141 self.set_offset(base + offset);
1142 }
1143 self
1144 }
1145}