1use crate::combinator::trace;
4use crate::combinator::trace_result;
5use crate::combinator::DisplayDebug;
6#[cfg(feature = "unstable-recover")]
7#[cfg(feature = "std")]
8use crate::error::FromRecoverableError;
9use crate::error::{AddContext, ErrMode, ErrorKind, FromExternalError, ParserError};
10use crate::lib::std::borrow::Borrow;
11use crate::lib::std::ops::Range;
12#[cfg(feature = "unstable-recover")]
13#[cfg(feature = "std")]
14use crate::stream::Recover;
15use crate::stream::StreamIsPartial;
16use crate::stream::{Location, Stream};
17use crate::*;
18
19pub struct ByRef<'p, P> {
21 pub(crate) p: &'p mut P,
22}
23
24impl<I, O, E, P> Parser<I, O, E> for ByRef<'_, P>
25where
26 P: Parser<I, O, E>,
27{
28 #[inline(always)]
29 fn parse_next(&mut self, i: &mut I) -> PResult<O, E> {
30 self.p.parse_next(i)
31 }
32}
33
34pub struct Map<F, G, I, O, O2, E>
36where
37 F: Parser<I, O, E>,
38 G: FnMut(O) -> O2,
39{
40 pub(crate) parser: F,
41 pub(crate) map: G,
42 pub(crate) i: core::marker::PhantomData<I>,
43 pub(crate) o: core::marker::PhantomData<O>,
44 pub(crate) o2: core::marker::PhantomData<O2>,
45 pub(crate) e: core::marker::PhantomData<E>,
46}
47
48impl<F, G, I, O, O2, E> Parser<I, O2, E> for Map<F, G, I, O, O2, E>
49where
50 F: Parser<I, O, E>,
51 G: FnMut(O) -> O2,
52{
53 #[inline]
54 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
55 match self.parser.parse_next(i) {
56 Err(e) => Err(e),
57 Ok(o) => Ok((self.map)(o)),
58 }
59 }
60}
61
62pub struct TryMap<F, G, I, O, O2, E, E2>
64where
65 F: Parser<I, O, E>,
66 G: FnMut(O) -> Result<O2, E2>,
67 I: Stream,
68 E: FromExternalError<I, E2>,
69{
70 pub(crate) parser: F,
71 pub(crate) map: G,
72 pub(crate) i: core::marker::PhantomData<I>,
73 pub(crate) o: core::marker::PhantomData<O>,
74 pub(crate) o2: core::marker::PhantomData<O2>,
75 pub(crate) e: core::marker::PhantomData<E>,
76 pub(crate) e2: core::marker::PhantomData<E2>,
77}
78
79impl<F, G, I, O, O2, E, E2> Parser<I, O2, E> for TryMap<F, G, I, O, O2, E, E2>
80where
81 F: Parser<I, O, E>,
82 G: FnMut(O) -> Result<O2, E2>,
83 I: Stream,
84 E: FromExternalError<I, E2>,
85{
86 #[inline]
87 fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> {
88 let start = input.checkpoint();
89 let o = self.parser.parse_next(input)?;
90 let res = (self.map)(o).map_err(|err| {
91 input.reset(&start);
92 ErrMode::from_external_error(input, ErrorKind::Verify, err)
93 });
94 trace_result("verify", &res);
95 res
96 }
97}
98
99pub struct VerifyMap<F, G, I, O, O2, E>
101where
102 F: Parser<I, O, E>,
103 G: FnMut(O) -> Option<O2>,
104 I: Stream,
105 E: ParserError<I>,
106{
107 pub(crate) parser: F,
108 pub(crate) map: G,
109 pub(crate) i: core::marker::PhantomData<I>,
110 pub(crate) o: core::marker::PhantomData<O>,
111 pub(crate) o2: core::marker::PhantomData<O2>,
112 pub(crate) e: core::marker::PhantomData<E>,
113}
114
115impl<F, G, I, O, O2, E> Parser<I, O2, E> for VerifyMap<F, G, I, O, O2, E>
116where
117 F: Parser<I, O, E>,
118 G: FnMut(O) -> Option<O2>,
119 I: Stream,
120 E: ParserError<I>,
121{
122 #[inline]
123 fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> {
124 let start = input.checkpoint();
125 let o = self.parser.parse_next(input)?;
126 let res = (self.map)(o).ok_or_else(|| {
127 input.reset(&start);
128 ErrMode::from_error_kind(input, ErrorKind::Verify)
129 });
130 trace_result("verify", &res);
131 res
132 }
133}
134
135pub struct AndThen<F, G, I, O, O2, E>
137where
138 F: Parser<I, O, E>,
139 G: Parser<O, O2, E>,
140 O: StreamIsPartial,
141 I: Stream,
142{
143 pub(crate) outer: F,
144 pub(crate) inner: G,
145 pub(crate) i: core::marker::PhantomData<I>,
146 pub(crate) o: core::marker::PhantomData<O>,
147 pub(crate) o2: core::marker::PhantomData<O2>,
148 pub(crate) e: core::marker::PhantomData<E>,
149}
150
151impl<F, G, I, O, O2, E> Parser<I, O2, E> for AndThen<F, G, I, O, O2, E>
152where
153 F: Parser<I, O, E>,
154 G: Parser<O, O2, E>,
155 O: StreamIsPartial,
156 I: Stream,
157{
158 #[inline(always)]
159 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
160 let start = i.checkpoint();
161 let mut o = self.outer.parse_next(i)?;
162 let _ = o.complete();
163 let o2 = self.inner.parse_next(&mut o).map_err(|err| {
164 i.reset(&start);
165 err
166 })?;
167 Ok(o2)
168 }
169}
170
171pub struct ParseTo<P, I, O, O2, E>
173where
174 P: Parser<I, O, E>,
175 I: Stream,
176 O: crate::stream::ParseSlice<O2>,
177 E: ParserError<I>,
178{
179 pub(crate) p: P,
180 pub(crate) i: core::marker::PhantomData<I>,
181 pub(crate) o: core::marker::PhantomData<O>,
182 pub(crate) o2: core::marker::PhantomData<O2>,
183 pub(crate) e: core::marker::PhantomData<E>,
184}
185
186impl<P, I, O, O2, E> Parser<I, O2, E> for ParseTo<P, I, O, O2, E>
187where
188 P: Parser<I, O, E>,
189 I: Stream,
190 O: crate::stream::ParseSlice<O2>,
191 E: ParserError<I>,
192{
193 #[inline]
194 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
195 let start = i.checkpoint();
196 let o = self.p.parse_next(i)?;
197 let res = o.parse_slice().ok_or_else(|| {
198 i.reset(&start);
199 ErrMode::from_error_kind(i, ErrorKind::Verify)
200 });
201 trace_result("verify", &res);
202 res
203 }
204}
205
206pub struct FlatMap<F, G, H, I, O, O2, E>
208where
209 F: Parser<I, O, E>,
210 G: FnMut(O) -> H,
211 H: Parser<I, O2, E>,
212{
213 pub(crate) f: F,
214 pub(crate) g: G,
215 pub(crate) h: core::marker::PhantomData<H>,
216 pub(crate) i: core::marker::PhantomData<I>,
217 pub(crate) o: core::marker::PhantomData<O>,
218 pub(crate) o2: core::marker::PhantomData<O2>,
219 pub(crate) e: core::marker::PhantomData<E>,
220}
221
222impl<F, G, H, I, O, O2, E> Parser<I, O2, E> for FlatMap<F, G, H, I, O, O2, E>
223where
224 F: Parser<I, O, E>,
225 G: FnMut(O) -> H,
226 H: Parser<I, O2, E>,
227{
228 #[inline(always)]
229 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
230 let o = self.f.parse_next(i)?;
231 (self.g)(o).parse_next(i)
232 }
233}
234
235pub struct CompleteErr<F> {
237 pub(crate) f: F,
238}
239
240impl<F, I, O, E> Parser<I, O, E> for CompleteErr<F>
241where
242 I: Stream,
243 F: Parser<I, O, E>,
244 E: ParserError<I>,
245{
246 #[inline]
247 fn parse_next(&mut self, input: &mut I) -> PResult<O, E> {
248 trace("complete_err", |input: &mut I| {
249 match (self.f).parse_next(input) {
250 Err(ErrMode::Incomplete(_)) => {
251 Err(ErrMode::from_error_kind(input, ErrorKind::Complete))
252 }
253 rest => rest,
254 }
255 })
256 .parse_next(input)
257 }
258}
259
260pub struct Verify<F, G, I, O, O2, E>
262where
263 F: Parser<I, O, E>,
264 G: FnMut(&O2) -> bool,
265 I: Stream,
266 O: Borrow<O2>,
267 O2: ?Sized,
268 E: ParserError<I>,
269{
270 pub(crate) parser: F,
271 pub(crate) filter: G,
272 pub(crate) i: core::marker::PhantomData<I>,
273 pub(crate) o: core::marker::PhantomData<O>,
274 pub(crate) o2: core::marker::PhantomData<O2>,
275 pub(crate) e: core::marker::PhantomData<E>,
276}
277
278impl<F, G, I, O, O2, E> Parser<I, O, E> for Verify<F, G, I, O, O2, E>
279where
280 F: Parser<I, O, E>,
281 G: FnMut(&O2) -> bool,
282 I: Stream,
283 O: Borrow<O2>,
284 O2: ?Sized,
285 E: ParserError<I>,
286{
287 #[inline]
288 fn parse_next(&mut self, input: &mut I) -> PResult<O, E> {
289 let start = input.checkpoint();
290 let o = self.parser.parse_next(input)?;
291 let res = (self.filter)(o.borrow()).then_some(o).ok_or_else(|| {
292 input.reset(&start);
293 ErrMode::from_error_kind(input, ErrorKind::Verify)
294 });
295 trace_result("verify", &res);
296 res
297 }
298}
299
300pub struct Value<F, I, O, O2, E>
302where
303 F: Parser<I, O, E>,
304 O2: Clone,
305{
306 pub(crate) parser: F,
307 pub(crate) val: O2,
308 pub(crate) i: core::marker::PhantomData<I>,
309 pub(crate) o: core::marker::PhantomData<O>,
310 pub(crate) e: core::marker::PhantomData<E>,
311}
312
313impl<F, I, O, O2, E> Parser<I, O2, E> for Value<F, I, O, O2, E>
314where
315 F: Parser<I, O, E>,
316 O2: Clone,
317{
318 #[inline]
319 fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> {
320 (self.parser).parse_next(input).map(|_| self.val.clone())
321 }
322}
323
324pub struct DefaultValue<F, I, O, O2, E>
326where
327 F: Parser<I, O, E>,
328 O2: core::default::Default,
329{
330 pub(crate) parser: F,
331 pub(crate) o2: core::marker::PhantomData<O2>,
332 pub(crate) i: core::marker::PhantomData<I>,
333 pub(crate) o: core::marker::PhantomData<O>,
334 pub(crate) e: core::marker::PhantomData<E>,
335}
336
337impl<F, I, O, O2, E> Parser<I, O2, E> for DefaultValue<F, I, O, O2, E>
338where
339 F: Parser<I, O, E>,
340 O2: core::default::Default,
341{
342 #[inline]
343 fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> {
344 (self.parser).parse_next(input).map(|_| O2::default())
345 }
346}
347
348pub struct Void<F, I, O, E>
350where
351 F: Parser<I, O, E>,
352{
353 pub(crate) parser: F,
354 pub(crate) i: core::marker::PhantomData<I>,
355 pub(crate) o: core::marker::PhantomData<O>,
356 pub(crate) e: core::marker::PhantomData<E>,
357}
358
359impl<F, I, O, E> Parser<I, (), E> for Void<F, I, O, E>
360where
361 F: Parser<I, O, E>,
362{
363 #[inline(always)]
364 fn parse_next(&mut self, input: &mut I) -> PResult<(), E> {
365 (self.parser).parse_next(input).map(|_| ())
366 }
367}
368
369#[deprecated(since = "0.6.14", note = "Replaced with `Take`")]
371pub type Recognize<F, I, O, E> = Take<F, I, O, E>;
372
373pub struct Take<F, I, O, E>
375where
376 F: Parser<I, O, E>,
377 I: Stream,
378{
379 pub(crate) parser: F,
380 pub(crate) i: core::marker::PhantomData<I>,
381 pub(crate) o: core::marker::PhantomData<O>,
382 pub(crate) e: core::marker::PhantomData<E>,
383}
384
385impl<I, O, E, F> Parser<I, <I as Stream>::Slice, E> for Take<F, I, O, E>
386where
387 F: Parser<I, O, E>,
388 I: Stream,
389{
390 #[inline]
391 fn parse_next(&mut self, input: &mut I) -> PResult<<I as Stream>::Slice, E> {
392 let checkpoint = input.checkpoint();
393 match (self.parser).parse_next(input) {
394 Ok(_) => {
395 let offset = input.offset_from(&checkpoint);
396 input.reset(&checkpoint);
397 let taken = input.next_slice(offset);
398 Ok(taken)
399 }
400 Err(e) => Err(e),
401 }
402 }
403}
404
405#[deprecated(since = "0.6.14", note = "Replaced with `WithTaken`")]
407pub type WithRecognized<F, I, O, E> = WithTaken<F, I, O, E>;
408
409pub struct WithTaken<F, I, O, E>
411where
412 F: Parser<I, O, E>,
413 I: Stream,
414{
415 pub(crate) parser: F,
416 pub(crate) i: core::marker::PhantomData<I>,
417 pub(crate) o: core::marker::PhantomData<O>,
418 pub(crate) e: core::marker::PhantomData<E>,
419}
420
421impl<F, I, O, E> Parser<I, (O, <I as Stream>::Slice), E> for WithTaken<F, I, O, E>
422where
423 F: Parser<I, O, E>,
424 I: Stream,
425{
426 #[inline]
427 fn parse_next(&mut self, input: &mut I) -> PResult<(O, <I as Stream>::Slice), E> {
428 let checkpoint = input.checkpoint();
429 match (self.parser).parse_next(input) {
430 Ok(result) => {
431 let offset = input.offset_from(&checkpoint);
432 input.reset(&checkpoint);
433 let taken = input.next_slice(offset);
434 Ok((result, taken))
435 }
436 Err(e) => Err(e),
437 }
438 }
439}
440
441pub struct Span<F, I, O, E>
443where
444 F: Parser<I, O, E>,
445 I: Stream + Location,
446{
447 pub(crate) parser: F,
448 pub(crate) i: core::marker::PhantomData<I>,
449 pub(crate) o: core::marker::PhantomData<O>,
450 pub(crate) e: core::marker::PhantomData<E>,
451}
452
453impl<I, O, E, F> Parser<I, Range<usize>, E> for Span<F, I, O, E>
454where
455 F: Parser<I, O, E>,
456 I: Stream + Location,
457{
458 #[inline]
459 fn parse_next(&mut self, input: &mut I) -> PResult<Range<usize>, E> {
460 let start = input.location();
461 self.parser.parse_next(input).map(move |_| {
462 let end = input.location();
463 start..end
464 })
465 }
466}
467
468pub struct WithSpan<F, I, O, E>
470where
471 F: Parser<I, O, E>,
472 I: Stream + Location,
473{
474 pub(crate) parser: F,
475 pub(crate) i: core::marker::PhantomData<I>,
476 pub(crate) o: core::marker::PhantomData<O>,
477 pub(crate) e: core::marker::PhantomData<E>,
478}
479
480impl<F, I, O, E> Parser<I, (O, Range<usize>), E> for WithSpan<F, I, O, E>
481where
482 F: Parser<I, O, E>,
483 I: Stream + Location,
484{
485 #[inline]
486 fn parse_next(&mut self, input: &mut I) -> PResult<(O, Range<usize>), E> {
487 let start = input.location();
488 self.parser.parse_next(input).map(move |output| {
489 let end = input.location();
490 (output, (start..end))
491 })
492 }
493}
494
495pub struct OutputInto<F, I, O, O2, E>
497where
498 F: Parser<I, O, E>,
499 O: Into<O2>,
500{
501 pub(crate) parser: F,
502 pub(crate) i: core::marker::PhantomData<I>,
503 pub(crate) o: core::marker::PhantomData<O>,
504 pub(crate) o2: core::marker::PhantomData<O2>,
505 pub(crate) e: core::marker::PhantomData<E>,
506}
507
508impl<F, I, O, O2, E> Parser<I, O2, E> for OutputInto<F, I, O, O2, E>
509where
510 F: Parser<I, O, E>,
511 O: Into<O2>,
512{
513 #[inline]
514 fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> {
515 self.parser.parse_next(i).map(|o| o.into())
516 }
517}
518
519pub struct ErrInto<F, I, O, E, E2>
521where
522 F: Parser<I, O, E>,
523 E: Into<E2>,
524{
525 pub(crate) parser: F,
526 pub(crate) i: core::marker::PhantomData<I>,
527 pub(crate) o: core::marker::PhantomData<O>,
528 pub(crate) e: core::marker::PhantomData<E>,
529 pub(crate) e2: core::marker::PhantomData<E2>,
530}
531
532impl<F, I, O, E, E2> Parser<I, O, E2> for ErrInto<F, I, O, E, E2>
533where
534 F: Parser<I, O, E>,
535 E: Into<E2>,
536{
537 #[inline]
538 fn parse_next(&mut self, i: &mut I) -> PResult<O, E2> {
539 self.parser
540 .parse_next(i)
541 .map_err(|err| err.map(|e| e.into()))
542 }
543}
544
545pub struct Context<F, I, O, E, C>
547where
548 F: Parser<I, O, E>,
549 I: Stream,
550 E: AddContext<I, C>,
551 C: Clone + crate::lib::std::fmt::Debug,
552{
553 pub(crate) parser: F,
554 pub(crate) context: C,
555 pub(crate) i: core::marker::PhantomData<I>,
556 pub(crate) o: core::marker::PhantomData<O>,
557 pub(crate) e: core::marker::PhantomData<E>,
558}
559
560impl<F, I, O, E, C> Parser<I, O, E> for Context<F, I, O, E, C>
561where
562 F: Parser<I, O, E>,
563 I: Stream,
564 E: AddContext<I, C>,
565 C: Clone + crate::lib::std::fmt::Debug,
566{
567 #[inline]
568 fn parse_next(&mut self, i: &mut I) -> PResult<O, E> {
569 let context = self.context.clone();
570 trace(DisplayDebug(self.context.clone()), move |i: &mut I| {
571 let start = i.checkpoint();
572 (self.parser)
573 .parse_next(i)
574 .map_err(|err| err.add_context(i, &start, context.clone()))
575 })
576 .parse_next(i)
577 }
578}
579
580#[cfg(feature = "unstable-recover")]
582#[cfg(feature = "std")]
583pub struct RetryAfter<P, R, I, O, E>
584where
585 P: Parser<I, O, E>,
586 R: Parser<I, (), E>,
587 I: Stream,
588 I: Recover<E>,
589 E: FromRecoverableError<I, E>,
590{
591 pub(crate) parser: P,
592 pub(crate) recover: R,
593 pub(crate) i: core::marker::PhantomData<I>,
594 pub(crate) o: core::marker::PhantomData<O>,
595 pub(crate) e: core::marker::PhantomData<E>,
596}
597
598#[cfg(feature = "unstable-recover")]
599#[cfg(feature = "std")]
600impl<P, R, I, O, E> Parser<I, O, E> for RetryAfter<P, R, I, O, E>
601where
602 P: Parser<I, O, E>,
603 R: Parser<I, (), E>,
604 I: Stream,
605 I: Recover<E>,
606 E: FromRecoverableError<I, E>,
607{
608 #[inline(always)]
609 fn parse_next(&mut self, i: &mut I) -> PResult<O, E> {
610 if I::is_recovery_supported() {
611 retry_after_inner(&mut self.parser, &mut self.recover, i)
612 } else {
613 self.parser.parse_next(i)
614 }
615 }
616}
617
618#[cfg(feature = "unstable-recover")]
619#[cfg(feature = "std")]
620fn retry_after_inner<P, R, I, O, E>(parser: &mut P, recover: &mut R, i: &mut I) -> PResult<O, E>
621where
622 P: Parser<I, O, E>,
623 R: Parser<I, (), E>,
624 I: Stream,
625 I: Recover<E>,
626 E: FromRecoverableError<I, E>,
627{
628 loop {
629 let token_start = i.checkpoint();
630 let mut err = match parser.parse_next(i) {
631 Ok(o) => {
632 return Ok(o);
633 }
634 Err(ErrMode::Incomplete(e)) => return Err(ErrMode::Incomplete(e)),
635 Err(err) => err,
636 };
637 let err_start = i.checkpoint();
638 let err_start_eof_offset = i.eof_offset();
639 if recover.parse_next(i).is_ok() {
640 let i_eof_offset = i.eof_offset();
641 if err_start_eof_offset == i_eof_offset {
642 } else if let Err(err_) = i.record_err(&token_start, &err_start, err) {
644 err = err_;
645 } else {
646 continue;
647 }
648 }
649
650 i.reset(&err_start);
651 err = err.map(|err| E::from_recoverable_error(&token_start, &err_start, i, err));
652 return Err(err);
653 }
654}
655
656#[cfg(feature = "unstable-recover")]
658#[cfg(feature = "std")]
659pub struct ResumeAfter<P, R, I, O, E>
660where
661 P: Parser<I, O, E>,
662 R: Parser<I, (), E>,
663 I: Stream,
664 I: Recover<E>,
665 E: FromRecoverableError<I, E>,
666{
667 pub(crate) parser: P,
668 pub(crate) recover: R,
669 pub(crate) i: core::marker::PhantomData<I>,
670 pub(crate) o: core::marker::PhantomData<O>,
671 pub(crate) e: core::marker::PhantomData<E>,
672}
673
674#[cfg(feature = "unstable-recover")]
675#[cfg(feature = "std")]
676impl<P, R, I, O, E> Parser<I, Option<O>, E> for ResumeAfter<P, R, I, O, E>
677where
678 P: Parser<I, O, E>,
679 R: Parser<I, (), E>,
680 I: Stream,
681 I: Recover<E>,
682 E: FromRecoverableError<I, E>,
683{
684 #[inline(always)]
685 fn parse_next(&mut self, i: &mut I) -> PResult<Option<O>, E> {
686 if I::is_recovery_supported() {
687 resume_after_inner(&mut self.parser, &mut self.recover, i)
688 } else {
689 self.parser.parse_next(i).map(Some)
690 }
691 }
692}
693
694#[cfg(feature = "unstable-recover")]
695#[cfg(feature = "std")]
696fn resume_after_inner<P, R, I, O, E>(
697 parser: &mut P,
698 recover: &mut R,
699 i: &mut I,
700) -> PResult<Option<O>, E>
701where
702 P: Parser<I, O, E>,
703 R: Parser<I, (), E>,
704 I: Stream,
705 I: Recover<E>,
706 E: FromRecoverableError<I, E>,
707{
708 let token_start = i.checkpoint();
709 let mut err = match parser.parse_next(i) {
710 Ok(o) => {
711 return Ok(Some(o));
712 }
713 Err(ErrMode::Incomplete(e)) => return Err(ErrMode::Incomplete(e)),
714 Err(err) => err,
715 };
716 let err_start = i.checkpoint();
717 if recover.parse_next(i).is_ok() {
718 if let Err(err_) = i.record_err(&token_start, &err_start, err) {
719 err = err_;
720 } else {
721 return Ok(None);
722 }
723 }
724
725 i.reset(&err_start);
726 err = err.map(|err| E::from_recoverable_error(&token_start, &err_start, i, err));
727 Err(err)
728}