1use crate::combinator::trace;
2use crate::combinator::trace_result;
3use crate::combinator::DisplayDebug;
4#[cfg(feature = "unstable-recover")]
5#[cfg(feature = "std")]
6use crate::error::FromRecoverableError;
7use crate::error::{AddContext, ErrMode, ErrorKind, FromExternalError, ParserError};
8use crate::lib::std::borrow::Borrow;
9use crate::lib::std::ops::Range;
10#[cfg(feature = "unstable-recover")]
11#[cfg(feature = "std")]
12use crate::stream::Recover;
13use crate::stream::StreamIsPartial;
14use crate::stream::{Location, Stream};
15use crate::*;
16
17pub struct ByRef<'p, P> {
19 p: &'p mut P,
20}
21
22impl<'p, P> ByRef<'p, P> {
23 #[inline(always)]
24 pub(crate) fn new(p: &'p mut P) -> Self {
25 Self { p }
26 }
27}
28
29impl<'p, I, O, E, P> Parser<I, O, E> for ByRef<'p, P>
30where
31 P: Parser<I, O, E>,
32{
33 #[inline(always)]
34 fn parse_next(&mut self, i: &mut I) -> PResult<O, E> {
35 self.p.parse_next(i)
36 }
37}
38
39pub struct Map<F, G, I, O, O2, E>
41where
42 F: Parser<I, O, E>,
43 G: FnMut(O) -> O2,
44{
45 parser: F,
46 map: G,
47 i: core::marker::PhantomData<I>,
48 o: core::marker::PhantomData<O>,
49 o2: core::marker::PhantomData<O2>,
50 e: core::marker::PhantomData<E>,
51}
52
53impl<F, G, I, O, O2, E> Map<F, G, I, O, O2, E>
54where
55 F: Parser<I, O, E>,
56 G: FnMut(O) -> O2,
57{
58 #[inline(always)]
59 pub(crate) fn new(parser: F, map: G) -> Self {
60 Self {
61 parser,
62 map,
63 i: Default::default(),
64 o: Default::default(),
65 o2: Default::default(),
66 e: Default::default(),
67 }
68 }
69}
70
71impl<F, G, I, O, O2, E> Parser<I, O2, E> for Map<F, G, I, O, O2, E>
72where
73 F: Parser<I, O, E>,
74 G: FnMut(O) -> O2,
75{
76 #[inline]
77 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
78 match self.parser.parse_next(i) {
79 Err(e) => Err(e),
80 Ok(o) => Ok((self.map)(o)),
81 }
82 }
83}
84
85pub struct TryMap<F, G, I, O, O2, E, E2>
87where
88 F: Parser<I, O, E>,
89 G: FnMut(O) -> Result<O2, E2>,
90 I: Stream,
91 E: FromExternalError<I, E2>,
92{
93 parser: F,
94 map: G,
95 i: core::marker::PhantomData<I>,
96 o: core::marker::PhantomData<O>,
97 o2: core::marker::PhantomData<O2>,
98 e: core::marker::PhantomData<E>,
99 e2: core::marker::PhantomData<E2>,
100}
101
102impl<F, G, I, O, O2, E, E2> TryMap<F, G, I, O, O2, E, E2>
103where
104 F: Parser<I, O, E>,
105 G: FnMut(O) -> Result<O2, E2>,
106 I: Stream,
107 E: FromExternalError<I, E2>,
108{
109 #[inline(always)]
110 pub(crate) fn new(parser: F, map: G) -> Self {
111 Self {
112 parser,
113 map,
114 i: Default::default(),
115 o: Default::default(),
116 o2: Default::default(),
117 e: Default::default(),
118 e2: Default::default(),
119 }
120 }
121}
122
123impl<F, G, I, O, O2, E, E2> Parser<I, O2, E> for TryMap<F, G, I, O, O2, E, E2>
124where
125 F: Parser<I, O, E>,
126 G: FnMut(O) -> Result<O2, E2>,
127 I: Stream,
128 E: FromExternalError<I, E2>,
129{
130 #[inline]
131 fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> {
132 let start = input.checkpoint();
133 let o = self.parser.parse_next(input)?;
134 let res = (self.map)(o).map_err(|err| {
135 input.reset(&start);
136 ErrMode::from_external_error(input, ErrorKind::Verify, err)
137 });
138 trace_result("verify", &res);
139 res
140 }
141}
142
143pub struct VerifyMap<F, G, I, O, O2, E>
145where
146 F: Parser<I, O, E>,
147 G: FnMut(O) -> Option<O2>,
148 I: Stream,
149 E: ParserError<I>,
150{
151 parser: F,
152 map: G,
153 i: core::marker::PhantomData<I>,
154 o: core::marker::PhantomData<O>,
155 o2: core::marker::PhantomData<O2>,
156 e: core::marker::PhantomData<E>,
157}
158
159impl<F, G, I, O, O2, E> VerifyMap<F, G, I, O, O2, E>
160where
161 F: Parser<I, O, E>,
162 G: FnMut(O) -> Option<O2>,
163 I: Stream,
164 E: ParserError<I>,
165{
166 #[inline(always)]
167 pub(crate) fn new(parser: F, map: G) -> Self {
168 Self {
169 parser,
170 map,
171 i: Default::default(),
172 o: Default::default(),
173 o2: Default::default(),
174 e: Default::default(),
175 }
176 }
177}
178
179impl<F, G, I, O, O2, E> Parser<I, O2, E> for VerifyMap<F, G, I, O, O2, E>
180where
181 F: Parser<I, O, E>,
182 G: FnMut(O) -> Option<O2>,
183 I: Stream,
184 E: ParserError<I>,
185{
186 #[inline]
187 fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> {
188 let start = input.checkpoint();
189 let o = self.parser.parse_next(input)?;
190 let res = (self.map)(o).ok_or_else(|| {
191 input.reset(&start);
192 ErrMode::from_error_kind(input, ErrorKind::Verify)
193 });
194 trace_result("verify", &res);
195 res
196 }
197}
198
199pub struct AndThen<F, G, I, O, O2, E>
201where
202 F: Parser<I, O, E>,
203 G: Parser<O, O2, E>,
204 O: StreamIsPartial,
205 I: Stream,
206{
207 outer: F,
208 inner: G,
209 i: core::marker::PhantomData<I>,
210 o: core::marker::PhantomData<O>,
211 o2: core::marker::PhantomData<O2>,
212 e: core::marker::PhantomData<E>,
213}
214
215impl<F, G, I, O, O2, E> AndThen<F, G, I, O, O2, E>
216where
217 F: Parser<I, O, E>,
218 G: Parser<O, O2, E>,
219 O: StreamIsPartial,
220 I: Stream,
221{
222 #[inline(always)]
223 pub(crate) fn new(outer: F, inner: G) -> Self {
224 Self {
225 outer,
226 inner,
227 i: Default::default(),
228 o: Default::default(),
229 o2: Default::default(),
230 e: Default::default(),
231 }
232 }
233}
234
235impl<F, G, I, O, O2, E> Parser<I, O2, E> for AndThen<F, G, I, O, O2, E>
236where
237 F: Parser<I, O, E>,
238 G: Parser<O, O2, E>,
239 O: StreamIsPartial,
240 I: Stream,
241{
242 #[inline(always)]
243 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
244 let start = i.checkpoint();
245 let mut o = self.outer.parse_next(i)?;
246 let _ = o.complete();
247 let o2 = self.inner.parse_next(&mut o).map_err(|err| {
248 i.reset(&start);
249 err
250 })?;
251 Ok(o2)
252 }
253}
254
255pub struct ParseTo<P, I, O, O2, E>
257where
258 P: Parser<I, O, E>,
259 I: Stream,
260 O: crate::stream::ParseSlice<O2>,
261 E: ParserError<I>,
262{
263 p: P,
264 i: core::marker::PhantomData<I>,
265 o: core::marker::PhantomData<O>,
266 o2: core::marker::PhantomData<O2>,
267 e: core::marker::PhantomData<E>,
268}
269
270impl<P, I, O, O2, E> ParseTo<P, I, O, O2, E>
271where
272 P: Parser<I, O, E>,
273 I: Stream,
274 O: crate::stream::ParseSlice<O2>,
275 E: ParserError<I>,
276{
277 #[inline(always)]
278 pub(crate) fn new(p: P) -> Self {
279 Self {
280 p,
281 i: Default::default(),
282 o: Default::default(),
283 o2: Default::default(),
284 e: Default::default(),
285 }
286 }
287}
288
289impl<P, I, O, O2, E> Parser<I, O2, E> for ParseTo<P, I, O, O2, E>
290where
291 P: Parser<I, O, E>,
292 I: Stream,
293 O: crate::stream::ParseSlice<O2>,
294 E: ParserError<I>,
295{
296 #[inline]
297 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
298 let start = i.checkpoint();
299 let o = self.p.parse_next(i)?;
300 let res = o.parse_slice().ok_or_else(|| {
301 i.reset(&start);
302 ErrMode::from_error_kind(i, ErrorKind::Verify)
303 });
304 trace_result("verify", &res);
305 res
306 }
307}
308
309pub struct FlatMap<F, G, H, I, O, O2, E>
311where
312 F: Parser<I, O, E>,
313 G: FnMut(O) -> H,
314 H: Parser<I, O2, E>,
315{
316 f: F,
317 g: G,
318 h: core::marker::PhantomData<H>,
319 i: core::marker::PhantomData<I>,
320 o: core::marker::PhantomData<O>,
321 o2: core::marker::PhantomData<O2>,
322 e: core::marker::PhantomData<E>,
323}
324
325impl<F, G, H, I, O, O2, E> FlatMap<F, G, H, I, O, O2, E>
326where
327 F: Parser<I, O, E>,
328 G: FnMut(O) -> H,
329 H: Parser<I, O2, E>,
330{
331 #[inline(always)]
332 pub(crate) fn new(f: F, g: G) -> Self {
333 Self {
334 f,
335 g,
336 h: Default::default(),
337 i: Default::default(),
338 o: Default::default(),
339 o2: Default::default(),
340 e: Default::default(),
341 }
342 }
343}
344
345impl<F, G, H, I, O, O2, E> Parser<I, O2, E> for FlatMap<F, G, H, I, O, O2, E>
346where
347 F: Parser<I, O, E>,
348 G: FnMut(O) -> H,
349 H: Parser<I, O2, E>,
350{
351 #[inline(always)]
352 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
353 let o = self.f.parse_next(i)?;
354 (self.g)(o).parse_next(i)
355 }
356}
357
358pub struct CompleteErr<F> {
360 f: F,
361}
362
363impl<F> CompleteErr<F> {
364 #[inline(always)]
365 pub(crate) fn new(f: F) -> Self {
366 Self { f }
367 }
368}
369
370impl<F, I, O, E> Parser<I, O, E> for CompleteErr<F>
371where
372 I: Stream,
373 F: Parser<I, O, E>,
374 E: ParserError<I>,
375{
376 #[inline]
377 fn parse_next(&mut self, input: &mut I) -> PResult<O, E> {
378 trace("complete_err", |input: &mut I| {
379 match (self.f).parse_next(input) {
380 Err(ErrMode::Incomplete(_)) => {
381 Err(ErrMode::from_error_kind(input, ErrorKind::Complete))
382 }
383 rest => rest,
384 }
385 })
386 .parse_next(input)
387 }
388}
389
390pub struct Verify<F, G, I, O, O2, E>
392where
393 F: Parser<I, O, E>,
394 G: FnMut(&O2) -> bool,
395 I: Stream,
396 O: Borrow<O2>,
397 O2: ?Sized,
398 E: ParserError<I>,
399{
400 parser: F,
401 filter: G,
402 i: core::marker::PhantomData<I>,
403 o: core::marker::PhantomData<O>,
404 o2: core::marker::PhantomData<O2>,
405 e: core::marker::PhantomData<E>,
406}
407
408impl<F, G, I, O, O2, E> Verify<F, G, I, O, O2, E>
409where
410 F: Parser<I, O, E>,
411 G: FnMut(&O2) -> bool,
412 I: Stream,
413 O: Borrow<O2>,
414 O2: ?Sized,
415 E: ParserError<I>,
416{
417 #[inline(always)]
418 pub(crate) fn new(parser: F, filter: G) -> Self {
419 Self {
420 parser,
421 filter,
422 i: Default::default(),
423 o: Default::default(),
424 o2: Default::default(),
425 e: Default::default(),
426 }
427 }
428}
429
430impl<F, G, I, O, O2, E> Parser<I, O, E> for Verify<F, G, I, O, O2, E>
431where
432 F: Parser<I, O, E>,
433 G: FnMut(&O2) -> bool,
434 I: Stream,
435 O: Borrow<O2>,
436 O2: ?Sized,
437 E: ParserError<I>,
438{
439 #[inline]
440 fn parse_next(&mut self, input: &mut I) -> PResult<O, E> {
441 let start = input.checkpoint();
442 let o = self.parser.parse_next(input)?;
443 let res = (self.filter)(o.borrow()).then_some(o).ok_or_else(|| {
444 input.reset(&start);
445 ErrMode::from_error_kind(input, ErrorKind::Verify)
446 });
447 trace_result("verify", &res);
448 res
449 }
450}
451
452pub struct Value<F, I, O, O2, E>
454where
455 F: Parser<I, O, E>,
456 O2: Clone,
457{
458 parser: F,
459 val: O2,
460 i: core::marker::PhantomData<I>,
461 o: core::marker::PhantomData<O>,
462 e: core::marker::PhantomData<E>,
463}
464
465impl<F, I, O, O2, E> Value<F, I, O, O2, E>
466where
467 F: Parser<I, O, E>,
468 O2: Clone,
469{
470 #[inline(always)]
471 pub(crate) fn new(parser: F, val: O2) -> Self {
472 Self {
473 parser,
474 val,
475 i: Default::default(),
476 o: Default::default(),
477 e: Default::default(),
478 }
479 }
480}
481
482impl<F, I, O, O2, E> Parser<I, O2, E> for Value<F, I, O, O2, E>
483where
484 F: Parser<I, O, E>,
485 O2: Clone,
486{
487 #[inline]
488 fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> {
489 (self.parser).parse_next(input).map(|_| self.val.clone())
490 }
491}
492
493pub struct DefaultValue<F, I, O, O2, E>
495where
496 F: Parser<I, O, E>,
497 O2: core::default::Default,
498{
499 parser: F,
500 o2: core::marker::PhantomData<O2>,
501 i: core::marker::PhantomData<I>,
502 o: core::marker::PhantomData<O>,
503 e: core::marker::PhantomData<E>,
504}
505
506impl<F, I, O, O2, E> DefaultValue<F, I, O, O2, E>
507where
508 F: Parser<I, O, E>,
509 O2: core::default::Default,
510{
511 #[inline(always)]
512 pub(crate) fn new(parser: F) -> Self {
513 Self {
514 parser,
515 o2: Default::default(),
516 i: Default::default(),
517 o: Default::default(),
518 e: Default::default(),
519 }
520 }
521}
522
523impl<F, I, O, O2, E> Parser<I, O2, E> for DefaultValue<F, I, O, O2, E>
524where
525 F: Parser<I, O, E>,
526 O2: core::default::Default,
527{
528 #[inline]
529 fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> {
530 (self.parser).parse_next(input).map(|_| O2::default())
531 }
532}
533
534pub struct Void<F, I, O, E>
536where
537 F: Parser<I, O, E>,
538{
539 parser: F,
540 i: core::marker::PhantomData<I>,
541 o: core::marker::PhantomData<O>,
542 e: core::marker::PhantomData<E>,
543}
544
545impl<F, I, O, E> Void<F, I, O, E>
546where
547 F: Parser<I, O, E>,
548{
549 #[inline(always)]
550 pub(crate) fn new(parser: F) -> Self {
551 Self {
552 parser,
553 i: Default::default(),
554 o: Default::default(),
555 e: Default::default(),
556 }
557 }
558}
559
560impl<F, I, O, E> Parser<I, (), E> for Void<F, I, O, E>
561where
562 F: Parser<I, O, E>,
563{
564 #[inline(always)]
565 fn parse_next(&mut self, input: &mut I) -> PResult<(), E> {
566 (self.parser).parse_next(input).map(|_| ())
567 }
568}
569
570#[deprecated(since = "0.6.14", note = "Replaced with `Take`")]
572pub type Recognize<F, I, O, E> = Take<F, I, O, E>;
573
574pub struct Take<F, I, O, E>
576where
577 F: Parser<I, O, E>,
578 I: Stream,
579{
580 parser: F,
581 i: core::marker::PhantomData<I>,
582 o: core::marker::PhantomData<O>,
583 e: core::marker::PhantomData<E>,
584}
585
586impl<F, I, O, E> Take<F, I, O, E>
587where
588 F: Parser<I, O, E>,
589 I: Stream,
590{
591 #[inline(always)]
592 pub(crate) fn new(parser: F) -> Self {
593 Self {
594 parser,
595 i: Default::default(),
596 o: Default::default(),
597 e: Default::default(),
598 }
599 }
600}
601
602impl<I, O, E, F> Parser<I, <I as Stream>::Slice, E> for Take<F, I, O, E>
603where
604 F: Parser<I, O, E>,
605 I: Stream,
606{
607 #[inline]
608 fn parse_next(&mut self, input: &mut I) -> PResult<<I as Stream>::Slice, E> {
609 let checkpoint = input.checkpoint();
610 match (self.parser).parse_next(input) {
611 Ok(_) => {
612 let offset = input.offset_from(&checkpoint);
613 input.reset(&checkpoint);
614 let taken = input.next_slice(offset);
615 Ok(taken)
616 }
617 Err(e) => Err(e),
618 }
619 }
620}
621
622#[deprecated(since = "0.6.14", note = "Replaced with `WithTaken`")]
624pub type WithRecognized<F, I, O, E> = WithTaken<F, I, O, E>;
625
626pub struct WithTaken<F, I, O, E>
628where
629 F: Parser<I, O, E>,
630 I: Stream,
631{
632 parser: F,
633 i: core::marker::PhantomData<I>,
634 o: core::marker::PhantomData<O>,
635 e: core::marker::PhantomData<E>,
636}
637
638impl<F, I, O, E> WithTaken<F, I, O, E>
639where
640 F: Parser<I, O, E>,
641 I: Stream,
642{
643 #[inline(always)]
644 pub(crate) fn new(parser: F) -> Self {
645 Self {
646 parser,
647 i: Default::default(),
648 o: Default::default(),
649 e: Default::default(),
650 }
651 }
652}
653
654impl<F, I, O, E> Parser<I, (O, <I as Stream>::Slice), E> for WithTaken<F, I, O, E>
655where
656 F: Parser<I, O, E>,
657 I: Stream,
658{
659 #[inline]
660 fn parse_next(&mut self, input: &mut I) -> PResult<(O, <I as Stream>::Slice), E> {
661 let checkpoint = input.checkpoint();
662 match (self.parser).parse_next(input) {
663 Ok(result) => {
664 let offset = input.offset_from(&checkpoint);
665 input.reset(&checkpoint);
666 let taken = input.next_slice(offset);
667 Ok((result, taken))
668 }
669 Err(e) => Err(e),
670 }
671 }
672}
673
674pub struct Span<F, I, O, E>
676where
677 F: Parser<I, O, E>,
678 I: Stream + Location,
679{
680 parser: F,
681 i: core::marker::PhantomData<I>,
682 o: core::marker::PhantomData<O>,
683 e: core::marker::PhantomData<E>,
684}
685
686impl<F, I, O, E> Span<F, I, O, E>
687where
688 F: Parser<I, O, E>,
689 I: Stream + Location,
690{
691 #[inline(always)]
692 pub(crate) fn new(parser: F) -> Self {
693 Self {
694 parser,
695 i: Default::default(),
696 o: Default::default(),
697 e: Default::default(),
698 }
699 }
700}
701
702impl<I, O, E, F> Parser<I, Range<usize>, E> for Span<F, I, O, E>
703where
704 F: Parser<I, O, E>,
705 I: Stream + Location,
706{
707 #[inline]
708 fn parse_next(&mut self, input: &mut I) -> PResult<Range<usize>, E> {
709 let start = input.location();
710 self.parser.parse_next(input).map(move |_| {
711 let end = input.location();
712 start..end
713 })
714 }
715}
716
717pub struct WithSpan<F, I, O, E>
719where
720 F: Parser<I, O, E>,
721 I: Stream + Location,
722{
723 parser: F,
724 i: core::marker::PhantomData<I>,
725 o: core::marker::PhantomData<O>,
726 e: core::marker::PhantomData<E>,
727}
728
729impl<F, I, O, E> WithSpan<F, I, O, E>
730where
731 F: Parser<I, O, E>,
732 I: Stream + Location,
733{
734 #[inline(always)]
735 pub(crate) fn new(parser: F) -> Self {
736 Self {
737 parser,
738 i: Default::default(),
739 o: Default::default(),
740 e: Default::default(),
741 }
742 }
743}
744
745impl<F, I, O, E> Parser<I, (O, Range<usize>), E> for WithSpan<F, I, O, E>
746where
747 F: Parser<I, O, E>,
748 I: Stream + Location,
749{
750 #[inline]
751 fn parse_next(&mut self, input: &mut I) -> PResult<(O, Range<usize>), E> {
752 let start = input.location();
753 self.parser.parse_next(input).map(move |output| {
754 let end = input.location();
755 (output, (start..end))
756 })
757 }
758}
759
760pub struct OutputInto<F, I, O, O2, E>
762where
763 F: Parser<I, O, E>,
764 O: Into<O2>,
765{
766 parser: F,
767 i: core::marker::PhantomData<I>,
768 o: core::marker::PhantomData<O>,
769 o2: core::marker::PhantomData<O2>,
770 e: core::marker::PhantomData<E>,
771}
772
773impl<F, I, O, O2, E> OutputInto<F, I, O, O2, E>
774where
775 F: Parser<I, O, E>,
776 O: Into<O2>,
777{
778 #[inline(always)]
779 pub(crate) fn new(parser: F) -> Self {
780 Self {
781 parser,
782 i: Default::default(),
783 o: Default::default(),
784 o2: Default::default(),
785 e: Default::default(),
786 }
787 }
788}
789
790impl<F, I, O, O2, E> Parser<I, O2, E> for OutputInto<F, I, O, O2, E>
791where
792 F: Parser<I, O, E>,
793 O: Into<O2>,
794{
795 #[inline]
796 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
797 self.parser.parse_next(i).map(|o| o.into())
798 }
799}
800
801pub struct ErrInto<F, I, O, E, E2>
803where
804 F: Parser<I, O, E>,
805 E: Into<E2>,
806{
807 parser: F,
808 i: core::marker::PhantomData<I>,
809 o: core::marker::PhantomData<O>,
810 e: core::marker::PhantomData<E>,
811 e2: core::marker::PhantomData<E2>,
812}
813
814impl<F, I, O, E, E2> ErrInto<F, I, O, E, E2>
815where
816 F: Parser<I, O, E>,
817 E: Into<E2>,
818{
819 #[inline(always)]
820 pub(crate) fn new(parser: F) -> Self {
821 Self {
822 parser,
823 i: Default::default(),
824 o: Default::default(),
825 e: Default::default(),
826 e2: Default::default(),
827 }
828 }
829}
830
831impl<F, I, O, E, E2> Parser<I, O, E2> for ErrInto<F, I, O, E, E2>
832where
833 F: Parser<I, O, E>,
834 E: Into<E2>,
835{
836 #[inline]
837 fn parse_next(&mut self, i: &mut I) -> PResult<O, E2> {
838 match self.parser.parse_next(i) {
839 Ok(ok) => Ok(ok),
840 Err(ErrMode::Backtrack(e)) => Err(ErrMode::Backtrack(e.into())),
841 Err(ErrMode::Cut(e)) => Err(ErrMode::Cut(e.into())),
842 Err(ErrMode::Incomplete(e)) => Err(ErrMode::Incomplete(e)),
843 }
844 }
845}
846
847pub struct Context<F, I, O, E, C>
849where
850 F: Parser<I, O, E>,
851 I: Stream,
852 E: AddContext<I, C>,
853 C: Clone + crate::lib::std::fmt::Debug,
854{
855 parser: F,
856 context: C,
857 i: core::marker::PhantomData<I>,
858 o: core::marker::PhantomData<O>,
859 e: core::marker::PhantomData<E>,
860}
861
862impl<F, I, O, E, C> Context<F, I, O, E, C>
863where
864 F: Parser<I, O, E>,
865 I: Stream,
866 E: AddContext<I, C>,
867 C: Clone + crate::lib::std::fmt::Debug,
868{
869 #[inline(always)]
870 pub(crate) fn new(parser: F, context: C) -> Self {
871 Self {
872 parser,
873 context,
874 i: Default::default(),
875 o: Default::default(),
876 e: Default::default(),
877 }
878 }
879}
880
881impl<F, I, O, E, C> Parser<I, O, E> for Context<F, I, O, E, C>
882where
883 F: Parser<I, O, E>,
884 I: Stream,
885 E: AddContext<I, C>,
886 C: Clone + crate::lib::std::fmt::Debug,
887{
888 #[inline]
889 fn parse_next(&mut self, i: &mut I) -> PResult<O, E> {
890 let context = self.context.clone();
891 trace(DisplayDebug(self.context.clone()), move |i: &mut I| {
892 let start = i.checkpoint();
893 (self.parser)
894 .parse_next(i)
895 .map_err(|err| err.add_context(i, &start, context.clone()))
896 })
897 .parse_next(i)
898 }
899}
900
901#[cfg(feature = "unstable-recover")]
903#[cfg(feature = "std")]
904pub struct RetryAfter<P, R, I, O, E>
905where
906 P: Parser<I, O, E>,
907 R: Parser<I, (), E>,
908 I: Stream,
909 I: Recover<E>,
910 E: FromRecoverableError<I, E>,
911{
912 parser: P,
913 recover: R,
914 i: core::marker::PhantomData<I>,
915 o: core::marker::PhantomData<O>,
916 e: core::marker::PhantomData<E>,
917}
918
919#[cfg(feature = "unstable-recover")]
920#[cfg(feature = "std")]
921impl<P, R, I, O, E> RetryAfter<P, R, I, O, E>
922where
923 P: Parser<I, O, E>,
924 R: Parser<I, (), E>,
925 I: Stream,
926 I: Recover<E>,
927 E: FromRecoverableError<I, E>,
928{
929 #[inline(always)]
930 pub(crate) fn new(parser: P, recover: R) -> Self {
931 Self {
932 parser,
933 recover,
934 i: Default::default(),
935 o: Default::default(),
936 e: Default::default(),
937 }
938 }
939}
940
941#[cfg(feature = "unstable-recover")]
942#[cfg(feature = "std")]
943impl<P, R, I, O, E> Parser<I, O, E> for RetryAfter<P, R, I, O, E>
944where
945 P: Parser<I, O, E>,
946 R: Parser<I, (), E>,
947 I: Stream,
948 I: Recover<E>,
949 E: FromRecoverableError<I, E>,
950{
951 #[inline(always)]
952 fn parse_next(&mut self, i: &mut I) -> PResult<O, E> {
953 if I::is_recovery_supported() {
954 retry_after_inner(&mut self.parser, &mut self.recover, i)
955 } else {
956 self.parser.parse_next(i)
957 }
958 }
959}
960
961#[cfg(feature = "unstable-recover")]
962#[cfg(feature = "std")]
963fn retry_after_inner<P, R, I, O, E>(parser: &mut P, recover: &mut R, i: &mut I) -> PResult<O, E>
964where
965 P: Parser<I, O, E>,
966 R: Parser<I, (), E>,
967 I: Stream,
968 I: Recover<E>,
969 E: FromRecoverableError<I, E>,
970{
971 loop {
972 let token_start = i.checkpoint();
973 let mut err = match parser.parse_next(i) {
974 Ok(o) => {
975 return Ok(o);
976 }
977 Err(ErrMode::Incomplete(e)) => return Err(ErrMode::Incomplete(e)),
978 Err(err) => err,
979 };
980 let err_start = i.checkpoint();
981 let err_start_eof_offset = i.eof_offset();
982 if recover.parse_next(i).is_ok() {
983 let i_eof_offset = i.eof_offset();
984 if err_start_eof_offset == i_eof_offset {
985 } else if let Err(err_) = i.record_err(&token_start, &err_start, err) {
987 err = err_;
988 } else {
989 continue;
990 }
991 }
992
993 i.reset(&err_start);
994 err = err.map(|err| E::from_recoverable_error(&token_start, &err_start, i, err));
995 return Err(err);
996 }
997}
998
999#[cfg(feature = "unstable-recover")]
1001#[cfg(feature = "std")]
1002pub struct ResumeAfter<P, R, I, O, E>
1003where
1004 P: Parser<I, O, E>,
1005 R: Parser<I, (), E>,
1006 I: Stream,
1007 I: Recover<E>,
1008 E: FromRecoverableError<I, E>,
1009{
1010 parser: P,
1011 recover: R,
1012 i: core::marker::PhantomData<I>,
1013 o: core::marker::PhantomData<O>,
1014 e: core::marker::PhantomData<E>,
1015}
1016
1017#[cfg(feature = "unstable-recover")]
1018#[cfg(feature = "std")]
1019impl<P, R, I, O, E> ResumeAfter<P, R, I, O, E>
1020where
1021 P: Parser<I, O, E>,
1022 R: Parser<I, (), E>,
1023 I: Stream,
1024 I: Recover<E>,
1025 E: FromRecoverableError<I, E>,
1026{
1027 #[inline(always)]
1028 pub(crate) fn new(parser: P, recover: R) -> Self {
1029 Self {
1030 parser,
1031 recover,
1032 i: Default::default(),
1033 o: Default::default(),
1034 e: Default::default(),
1035 }
1036 }
1037}
1038
1039#[cfg(feature = "unstable-recover")]
1040#[cfg(feature = "std")]
1041impl<P, R, I, O, E> Parser<I, Option<O>, E> for ResumeAfter<P, R, I, O, E>
1042where
1043 P: Parser<I, O, E>,
1044 R: Parser<I, (), E>,
1045 I: Stream,
1046 I: Recover<E>,
1047 E: FromRecoverableError<I, E>,
1048{
1049 #[inline(always)]
1050 fn parse_next(&mut self, i: &mut I) -> PResult<Option<O>, E> {
1051 if I::is_recovery_supported() {
1052 resume_after_inner(&mut self.parser, &mut self.recover, i)
1053 } else {
1054 self.parser.parse_next(i).map(Some)
1055 }
1056 }
1057}
1058
1059#[cfg(feature = "unstable-recover")]
1060#[cfg(feature = "std")]
1061fn resume_after_inner<P, R, I, O, E>(
1062 parser: &mut P,
1063 recover: &mut R,
1064 i: &mut I,
1065) -> PResult<Option<O>, E>
1066where
1067 P: Parser<I, O, E>,
1068 R: Parser<I, (), E>,
1069 I: Stream,
1070 I: Recover<E>,
1071 E: FromRecoverableError<I, E>,
1072{
1073 let token_start = i.checkpoint();
1074 let mut err = match parser.parse_next(i) {
1075 Ok(o) => {
1076 return Ok(Some(o));
1077 }
1078 Err(ErrMode::Incomplete(e)) => return Err(ErrMode::Incomplete(e)),
1079 Err(err) => err,
1080 };
1081 let err_start = i.checkpoint();
1082 if recover.parse_next(i).is_ok() {
1083 if let Err(err_) = i.record_err(&token_start, &err_start, err) {
1084 err = err_;
1085 } else {
1086 return Ok(None);
1087 }
1088 }
1089
1090 i.reset(&err_start);
1091 err = err.map(|err| E::from_recoverable_error(&token_start, &err_start, i, err));
1092 Err(err)
1093}