1use crate::{
4 error::{
5 Info, ParseError,
6 ParseResult::{self, *},
7 ResultExt, StreamError, Tracked,
8 },
9 lib::{fmt, marker::PhantomData, mem, str},
10 parser::ParseMode,
11 stream::{input_at_eof, span::Span, ResetStream, Stream, StreamErrorFor, StreamOnce},
12 Parser,
13};
14
15#[cfg(feature = "alloc")]
16use alloc::{boxed::Box, string::String, vec::Vec};
17
18#[cfg(feature = "alloc")]
19use crate::lib::any::Any;
20
21#[derive(Copy, Clone)]
22pub struct NotFollowedBy<P>(P);
23impl<Input, O, P> Parser<Input> for NotFollowedBy<P>
24where
25 Input: Stream,
26 P: Parser<Input, Output = O>,
27{
28 type Output = ();
29 type PartialState = P::PartialState;
30
31 parse_mode!(Input);
32 #[inline]
33 fn parse_mode_impl<M>(
34 &mut self,
35 mode: M,
36 input: &mut Input,
37 state: &mut Self::PartialState,
38 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
39 where
40 M: ParseMode,
41 {
42 let checkpoint = input.checkpoint();
43 let result = self.0.parse_mode(mode, input, state);
44 ctry!(input.reset(checkpoint).committed());
45 match result {
46 CommitOk(_) | PeekOk(_) => PeekErr(Input::Error::empty(input.position()).into()),
47 CommitErr(_) | PeekErr(_) => PeekOk(()),
48 }
49 }
50
51 #[inline]
52 fn add_error(&mut self, _errors: &mut Tracked<<Input as StreamOnce>::Error>) {}
53
54 fn add_committed_expected_error(&mut self, _error: &mut Tracked<<Input as StreamOnce>::Error>) {
55 }
56
57 forward_parser!(Input, parser_count, 0);
58}
59
60pub fn not_followed_by<Input, P>(parser: P) -> NotFollowedBy<P>
77where
78 Input: Stream,
79 P: Parser<Input>,
80 P::Output: Into<Info<<Input as StreamOnce>::Token, <Input as StreamOnce>::Range, &'static str>>,
81{
82 NotFollowedBy(parser)
83}
84
85#[derive(Copy, Clone)]
90pub struct Try<P>(P);
91impl<Input, O, P> Parser<Input> for Try<P>
92where
93 Input: Stream,
94 P: Parser<Input, Output = O>,
95{
96 type Output = O;
97 type PartialState = P::PartialState;
98
99 #[inline]
100 fn parse_stream(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error> {
101 self.parse_lazy(input)
102 }
103
104 parse_mode!(Input);
105 #[inline]
106 fn parse_committed_mode<M>(
107 &mut self,
108 mode: M,
109 input: &mut Input,
110 state: &mut Self::PartialState,
111 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
112 where
113 M: ParseMode,
114 {
115 self.parse_mode(mode, input, state)
116 }
117
118 #[inline]
119 fn parse_mode_impl<M>(
120 &mut self,
121 mode: M,
122 input: &mut Input,
123 state: &mut Self::PartialState,
124 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
125 where
126 M: ParseMode,
127 {
128 match self.0.parse_committed_mode(mode, input, state) {
129 v @ CommitOk(_) | v @ PeekOk(_) | v @ PeekErr(_) => v,
130 CommitErr(err) => {
131 if input.is_partial() && err.is_unexpected_end_of_input() {
132 CommitErr(err)
133 } else {
134 PeekErr(err.into())
135 }
136 }
137 }
138 }
139
140 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
141}
142
143pub fn attempt<Input, P>(p: P) -> Try<P>
160where
161 Input: Stream,
162 P: Parser<Input>,
163{
164 Try(p)
165}
166
167#[derive(Copy, Clone)]
168pub struct LookAhead<P>(P);
169
170impl<Input, O, P> Parser<Input> for LookAhead<P>
171where
172 Input: Stream,
173 P: Parser<Input, Output = O>,
174{
175 type Output = O;
176 type PartialState = ();
177
178 #[inline]
179 fn parse_lazy(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error> {
180 let before = input.checkpoint();
181 let result = self.0.parse_lazy(input);
182 ctry!(input.reset(before).committed());
183 let (o, _input) = ctry!(result);
184 PeekOk(o)
185 }
186
187 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
188}
189
190pub fn look_ahead<Input, P>(p: P) -> LookAhead<P>
207where
208 Input: Stream,
209 P: Parser<Input>,
210{
211 LookAhead(p)
212}
213
214#[derive(Copy, Clone)]
215pub struct Map<P, F>(P, F);
216impl<Input, A, B, P, F> Parser<Input> for Map<P, F>
217where
218 Input: Stream,
219 P: Parser<Input, Output = A>,
220 F: FnMut(A) -> B,
221{
222 type Output = B;
223 type PartialState = P::PartialState;
224
225 parse_mode!(Input);
226 #[inline]
227 fn parse_mode_impl<M>(
228 &mut self,
229 mode: M,
230 input: &mut Input,
231 state: &mut Self::PartialState,
232 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
233 where
234 M: ParseMode,
235 {
236 match self.0.parse_mode(mode, input, state) {
237 CommitOk(x) => CommitOk((self.1)(x)),
238 PeekOk(x) => PeekOk((self.1)(x)),
239 CommitErr(err) => CommitErr(err),
240 PeekErr(err) => PeekErr(err),
241 }
242 }
243
244 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
245}
246
247pub fn map<Input, P, F, B>(p: P, f: F) -> Map<P, F>
251where
252 Input: Stream,
253 P: Parser<Input>,
254 F: FnMut(P::Output) -> B,
255{
256 Map(p, f)
257}
258
259#[derive(Copy, Clone)]
260pub struct MapInput<P, F>(P, F);
261impl<Input, A, B, P, F> Parser<Input> for MapInput<P, F>
262where
263 Input: Stream,
264 P: Parser<Input, Output = A>,
265 F: FnMut(A, &mut Input) -> B,
266{
267 type Output = B;
268 type PartialState = P::PartialState;
269
270 parse_mode!(Input);
271 #[inline]
272 fn parse_mode_impl<M>(
273 &mut self,
274 mode: M,
275 input: &mut Input,
276 state: &mut Self::PartialState,
277 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
278 where
279 M: ParseMode,
280 {
281 match self.0.parse_mode(mode, input, state) {
282 CommitOk(x) => CommitOk((self.1)(x, input)),
283 PeekOk(x) => PeekOk((self.1)(x, input)),
284 CommitErr(err) => CommitErr(err),
285 PeekErr(err) => PeekErr(err),
286 }
287 }
288
289 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
290}
291
292pub fn map_input<Input, P, F, B>(p: P, f: F) -> MapInput<P, F>
296where
297 Input: Stream,
298 P: Parser<Input>,
299 F: FnMut(P::Output, &mut Input) -> B,
300{
301 MapInput(p, f)
302}
303
304#[derive(Copy, Clone)]
305pub struct FlatMap<P, F>(P, F);
306impl<Input, A, B, P, F> Parser<Input> for FlatMap<P, F>
307where
308 Input: Stream,
309 P: Parser<Input, Output = A>,
310 F: FnMut(A) -> Result<B, Input::Error>,
311{
312 type Output = B;
313 type PartialState = P::PartialState;
314
315 parse_mode!(Input);
316 #[inline]
317 fn parse_mode_impl<M>(
318 &mut self,
319 mode: M,
320 input: &mut Input,
321 state: &mut Self::PartialState,
322 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
323 where
324 M: ParseMode,
325 {
326 match self.0.parse_mode(mode, input, state) {
327 PeekOk(o) => match (self.1)(o) {
328 Ok(x) => PeekOk(x),
329 Err(err) => PeekErr(err.into()),
330 },
331 CommitOk(o) => match (self.1)(o) {
332 Ok(x) => CommitOk(x),
333 Err(err) => CommitErr(err),
334 },
335 PeekErr(err) => PeekErr(err),
336 CommitErr(err) => CommitErr(err),
337 }
338 }
339
340 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
341}
342
343pub fn flat_map<Input, P, F, B>(p: P, f: F) -> FlatMap<P, F>
347where
348 Input: Stream,
349 P: Parser<Input>,
350 F: FnMut(P::Output) -> Result<B, <Input as StreamOnce>::Error>,
351{
352 FlatMap(p, f)
353}
354
355#[derive(Copy, Clone)]
356pub struct AndThen<P, F>(P, F);
357impl<Input, P, F, O, E> Parser<Input> for AndThen<P, F>
358where
359 Input: Stream,
360 P: Parser<Input>,
361 F: FnMut(P::Output) -> Result<O, E>,
362 E: Into<<Input::Error as ParseError<Input::Token, Input::Range, Input::Position>>::StreamError>,
363{
364 type Output = O;
365 type PartialState = P::PartialState;
366
367 parse_mode!(Input);
368 fn parse_mode_impl<M>(
369 &mut self,
370 mode: M,
371 input: &mut Input,
372 state: &mut Self::PartialState,
373 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
374 where
375 M: ParseMode,
376 {
377 let position = input.position();
378 let checkpoint = input.checkpoint();
379 match self.0.parse_mode(mode, input, state) {
380 PeekOk(o) => match (self.1)(o) {
381 Ok(o) => PeekOk(o),
382 Err(err) => {
383 let err = <Input as StreamOnce>::Error::from_error(position, err.into());
384
385 if input.is_partial() && input_at_eof(input) {
386 ctry!(input.reset(checkpoint).committed());
387 CommitErr(err)
388 } else {
389 PeekErr(err.into())
390 }
391 }
392 },
393 CommitOk(o) => match (self.1)(o) {
394 Ok(o) => CommitOk(o),
395 Err(err) => {
396 if input.is_partial() && input_at_eof(input) {
397 ctry!(input.reset(checkpoint).committed());
398 }
399 CommitErr(<Input as StreamOnce>::Error::from_error(
400 position,
401 err.into(),
402 ))
403 }
404 },
405 PeekErr(err) => PeekErr(err),
406 CommitErr(err) => CommitErr(err),
407 }
408 }
409
410 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
411}
412
413pub fn and_then<Input, P, F, O, E>(p: P, f: F) -> AndThen<P, F>
417where
418 P: Parser<Input>,
419 F: FnMut(P::Output) -> Result<O, E>,
420 Input: Stream,
421 E: Into<<Input::Error as ParseError<Input::Token, Input::Range, Input::Position>>::StreamError>,
422{
423 AndThen(p, f)
424}
425
426#[derive(Copy, Clone)]
427pub struct Recognize<F, P>(P, PhantomData<fn() -> F>);
428
429impl<F, P> Recognize<F, P> {
430 #[inline]
431 fn recognize_result<Input>(
432 elements: &mut F,
433 before: <Input as ResetStream>::Checkpoint,
434 input: &mut Input,
435 result: ParseResult<P::Output, <Input as StreamOnce>::Error>,
436 ) -> ParseResult<F, <Input as StreamOnce>::Error>
437 where
438 P: Parser<Input>,
439 Input: Stream,
440 F: Default + Extend<Input::Token>,
441 {
442 match result {
443 PeekOk(_) => {
444 let last_position = input.position();
445 ctry!(input.reset(before).committed());
446
447 while input.position() != last_position {
448 match input.uncons() {
449 Ok(elem) => elements.extend(Some(elem)),
450 Err(err) => {
451 return PeekErr(
452 <Input as StreamOnce>::Error::from_error(input.position(), err)
453 .into(),
454 );
455 }
456 }
457 }
458 PeekOk(mem::take(elements))
459 }
460 CommitOk(_) => {
461 let last_position = input.position();
462 ctry!(input.reset(before).committed());
463
464 while input.position() != last_position {
465 match input.uncons() {
466 Ok(elem) => elements.extend(Some(elem)),
467 Err(err) => {
468 return CommitErr(<Input as StreamOnce>::Error::from_error(
469 input.position(),
470 err,
471 ));
472 }
473 }
474 }
475 CommitOk(mem::take(elements))
476 }
477 CommitErr(err) => {
478 let last_position = input.position();
479 ctry!(input.reset(before).committed());
480
481 while input.position() != last_position {
482 match input.uncons() {
483 Ok(elem) => elements.extend(Some(elem)),
484 Err(err) => {
485 return CommitErr(<Input as StreamOnce>::Error::from_error(
486 input.position(),
487 err,
488 ));
489 }
490 }
491 }
492 CommitErr(err)
493 }
494 PeekErr(err) => PeekErr(err),
495 }
496 }
497}
498
499impl<Input, P, F> Parser<Input> for Recognize<F, P>
500where
501 Input: Stream,
502 P: Parser<Input>,
503 F: Default + Extend<<Input as StreamOnce>::Token>,
504{
505 type Output = F;
506 type PartialState = (F, P::PartialState);
507
508 parse_mode!(Input);
509 fn parse_mode_impl<M>(
510 &mut self,
511 mode: M,
512 input: &mut Input,
513 state: &mut Self::PartialState,
514 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
515 where
516 M: ParseMode,
517 {
518 let (ref mut elements, ref mut child_state) = *state;
519
520 let before = input.checkpoint();
521 let result = self.0.parse_mode(mode, input, child_state);
522 Self::recognize_result(elements, before, input, result)
523 }
524
525 #[inline]
526 fn add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
527 self.0.add_error(errors)
528 }
529}
530
531pub fn recognize<F, Input, P>(parser: P) -> Recognize<F, P>
543where
544 Input: Stream,
545 P: Parser<Input>,
546 F: Default + Extend<<Input as StreamOnce>::Token>,
547{
548 Recognize(parser, PhantomData)
549}
550
551pub enum Either<L, R> {
552 Left(L),
553 Right(R),
554}
555
556impl<Input, L, R> Parser<Input> for Either<L, R>
557where
558 Input: Stream,
559 L: Parser<Input>,
560 R: Parser<Input, Output = L::Output>,
561{
562 type Output = L::Output;
563 type PartialState = Option<Either<L::PartialState, R::PartialState>>;
564
565 #[inline]
566 fn parse_lazy(
567 &mut self,
568 input: &mut Input,
569 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
570 match *self {
571 Either::Left(ref mut x) => x.parse_lazy(input),
572 Either::Right(ref mut x) => x.parse_lazy(input),
573 }
574 }
575
576 parse_mode!(Input);
577 #[inline]
578 fn parse_mode_impl<M>(
579 &mut self,
580 mode: M,
581 input: &mut Input,
582 state: &mut Self::PartialState,
583 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
584 where
585 M: ParseMode,
586 {
587 match *self {
588 Either::Left(ref mut x) => {
589 match *state {
590 None | Some(Either::Right(_)) => {
591 *state = Some(Either::Left(L::PartialState::default()))
592 }
593 Some(Either::Left(_)) => (),
594 }
595 x.parse_mode(
596 mode,
597 input,
598 match state {
599 Some(Either::Left(state)) => state,
600 _ => unreachable!(),
601 },
602 )
603 }
604 Either::Right(ref mut x) => {
605 match *state {
606 None | Some(Either::Left(_)) => {
607 *state = Some(Either::Right(R::PartialState::default()))
608 }
609 Some(Either::Right(_)) => (),
610 }
611 x.parse_mode(
612 mode,
613 input,
614 match state {
615 Some(Either::Right(state)) => state,
616 _ => unreachable!(),
617 },
618 )
619 }
620 }
621 }
622
623 #[inline]
624 fn add_error(&mut self, error: &mut Tracked<<Input as StreamOnce>::Error>) {
625 match *self {
626 Either::Left(ref mut x) => x.add_error(error),
627 Either::Right(ref mut x) => x.add_error(error),
628 }
629 }
630}
631
632pub struct NoPartial<P>(P);
633
634impl<Input, P> Parser<Input> for NoPartial<P>
635where
636 Input: Stream,
637 P: Parser<Input>,
638{
639 type Output = <P as Parser<Input>>::Output;
640 type PartialState = ();
641
642 #[inline]
643 fn parse_lazy(
644 &mut self,
645 input: &mut Input,
646 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
647 self.0.parse_lazy(input)
648 }
649
650 parse_mode!(Input);
651 #[inline]
652 fn parse_mode_impl<M>(
653 &mut self,
654 _mode: M,
655 input: &mut Input,
656 _state: &mut Self::PartialState,
657 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
658 where
659 M: ParseMode,
660 {
661 self.0.parse_lazy(input)
662 }
663
664 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
665}
666
667pub fn no_partial<Input, P>(p: P) -> NoPartial<P>
668where
669 Input: Stream,
670 P: Parser<Input>,
671{
672 NoPartial(p)
673}
674
675#[derive(Copy, Clone)]
676pub struct Ignore<P>(P);
677impl<Input, P> Parser<Input> for Ignore<P>
678where
679 Input: Stream,
680 P: Parser<Input>,
681{
682 type Output = ();
683 type PartialState = P::PartialState;
684
685 #[inline]
686 fn parse_lazy(
687 &mut self,
688 input: &mut Input,
689 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
690 self.0.parse_lazy(input).map(|_| ())
691 }
692
693 parse_mode!(Input);
694 #[inline]
695 fn parse_mode_impl<M>(
696 &mut self,
697 mode: M,
698 input: &mut Input,
699 state: &mut Self::PartialState,
700 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
701 where
702 M: ParseMode,
703 {
704 self.0.parse_mode(mode, input, state).map(|_| ())
705 }
706
707 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
708}
709
710#[doc(hidden)]
711pub fn ignore<Input, P>(p: P) -> Ignore<P>
712where
713 Input: Stream,
714 P: Parser<Input>,
715{
716 Ignore(p)
717}
718
719#[cfg(feature = "alloc")]
720#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
721#[derive(Default)]
722pub struct AnyPartialState(Option<Box<dyn Any>>);
723
724#[cfg(feature = "alloc")]
725#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
726pub struct AnyPartialStateParser<P>(P);
727
728#[cfg(feature = "alloc")]
729impl<Input, P> Parser<Input> for AnyPartialStateParser<P>
730where
731 Input: Stream,
732 P: Parser<Input>,
733 P::PartialState: 'static,
734{
735 type Output = P::Output;
736 type PartialState = AnyPartialState;
737
738 #[inline]
739 fn parse_lazy(
740 &mut self,
741 input: &mut Input,
742 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
743 self.0.parse_lazy(input)
744 }
745
746 parse_mode!(Input);
747 #[inline]
748 fn parse_mode<M>(
749 &mut self,
750 mode: M,
751 input: &mut Input,
752 state: &mut Self::PartialState,
753 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
754 where
755 M: ParseMode,
756 {
757 let mut new_child_state;
758 let result = {
759 let child_state = if state.0.is_none() {
760 new_child_state = Some(Default::default());
761 new_child_state.as_mut().unwrap()
762 } else {
763 new_child_state = None;
764 state.0.as_mut().unwrap().downcast_mut().unwrap()
765 };
766
767 self.0.parse_mode(mode, input, child_state)
768 };
769
770 if let CommitErr(_) = result {
771 if state.0.is_none() {
772 state.0 = Some(Box::new(new_child_state.unwrap()));
774 }
775 }
776
777 result
778 }
779
780 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
781}
782
783#[cfg(feature = "alloc")]
812#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
813pub fn any_partial_state<Input, P>(p: P) -> AnyPartialStateParser<P>
814where
815 Input: Stream,
816 P: Parser<Input>,
817 P::PartialState: 'static,
818{
819 AnyPartialStateParser(p)
820}
821
822#[cfg(feature = "alloc")]
823#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
824#[derive(Default)]
825pub struct AnySendPartialState(Option<Box<dyn Any + Send>>);
826
827#[cfg(feature = "alloc")]
828#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
829pub struct AnySendPartialStateParser<P>(P);
830
831#[cfg(feature = "alloc")]
832impl<Input, P> Parser<Input> for AnySendPartialStateParser<P>
833where
834 Input: Stream,
835 P: Parser<Input>,
836 P::PartialState: Send + 'static,
837{
838 type Output = P::Output;
839 type PartialState = AnySendPartialState;
840
841 #[inline]
842 fn parse_lazy(
843 &mut self,
844 input: &mut Input,
845 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
846 self.0.parse_lazy(input)
847 }
848
849 parse_mode!(Input);
850 #[inline]
851 fn parse_mode<M>(
852 &mut self,
853 mode: M,
854 input: &mut Input,
855 state: &mut Self::PartialState,
856 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
857 where
858 M: ParseMode,
859 {
860 let mut new_child_state;
861 let result = {
862 let child_state = if state.0.is_none() {
863 new_child_state = Some(Default::default());
864 new_child_state.as_mut().unwrap()
865 } else {
866 new_child_state = None;
867 state.0.as_mut().unwrap().downcast_mut().unwrap()
868 };
869
870 self.0.parse_mode(mode, input, child_state)
871 };
872
873 if let CommitErr(_) = result {
874 if state.0.is_none() {
875 state.0 = Some(Box::new(new_child_state.unwrap()));
877 }
878 }
879
880 result
881 }
882
883 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
884}
885
886#[cfg(feature = "alloc")]
915#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
916pub fn any_send_partial_state<Input, P>(p: P) -> AnySendPartialStateParser<P>
917where
918 Input: Stream,
919 P: Parser<Input>,
920 P::PartialState: Send + 'static,
921{
922 AnySendPartialStateParser(p)
923}
924
925#[cfg(feature = "alloc")]
926#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
927#[derive(Default)]
928pub struct AnySendSyncPartialState(Option<Box<dyn Any + Send + Sync>>);
929
930#[cfg(feature = "alloc")]
931#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
932pub struct AnySendSyncPartialStateParser<P>(P);
933
934#[cfg(feature = "alloc")]
935impl<Input, P> Parser<Input> for AnySendSyncPartialStateParser<P>
936where
937 Input: Stream,
938 P: Parser<Input>,
939 P::PartialState: Send + Sync + 'static,
940{
941 type Output = P::Output;
942 type PartialState = AnySendSyncPartialState;
943
944 #[inline]
945 fn parse_lazy(
946 &mut self,
947 input: &mut Input,
948 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
949 self.0.parse_lazy(input)
950 }
951
952 parse_mode!(Input);
953 #[inline]
954 fn parse_mode<M>(
955 &mut self,
956 mode: M,
957 input: &mut Input,
958 state: &mut Self::PartialState,
959 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
960 where
961 M: ParseMode,
962 {
963 let mut new_child_state;
964 let result = {
965 let child_state = if state.0.is_none() {
966 new_child_state = Some(Default::default());
967 new_child_state.as_mut().unwrap()
968 } else {
969 new_child_state = None;
970 state.0.as_mut().unwrap().downcast_mut().unwrap()
971 };
972
973 self.0.parse_mode(mode, input, child_state)
974 };
975
976 if let CommitErr(_) = result {
977 if state.0.is_none() {
978 state.0 = Some(Box::new(new_child_state.unwrap()));
980 }
981 }
982
983 result
984 }
985
986 forward_parser!(Input, add_error add_committed_expected_error parser_count, 0);
987}
988
989#[cfg(feature = "alloc")]
1016#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
1017pub fn any_send_sync_partial_state<Input, P>(p: P) -> AnySendSyncPartialStateParser<P>
1018where
1019 Input: Stream,
1020 P: Parser<Input>,
1021 P::PartialState: Send + Sync + 'static,
1022{
1023 AnySendSyncPartialStateParser(p)
1024}
1025
1026#[derive(Copy, Clone)]
1027pub struct Lazy<P>(P);
1028impl<Input, O, P, R> Parser<Input> for Lazy<P>
1029where
1030 Input: Stream,
1031 P: FnMut() -> R,
1032 R: Parser<Input, Output = O>,
1033{
1034 type Output = O;
1035 type PartialState = R::PartialState;
1036
1037 fn parse_stream(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error> {
1038 (self.0)().parse_stream(input)
1039 }
1040
1041 fn parse_lazy(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error> {
1042 (self.0)().parse_lazy(input)
1043 }
1044
1045 parse_mode!(Input);
1046
1047 fn parse_committed_mode<M>(
1048 &mut self,
1049 mode: M,
1050 input: &mut Input,
1051 state: &mut Self::PartialState,
1052 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
1053 where
1054 M: ParseMode,
1055 {
1056 (self.0)().parse_mode(mode, input, state)
1057 }
1058
1059 fn parse_mode_impl<M>(
1060 &mut self,
1061 mode: M,
1062 input: &mut Input,
1063 state: &mut Self::PartialState,
1064 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
1065 where
1066 M: ParseMode,
1067 {
1068 (self.0)().parse_mode_impl(mode, input, state)
1069 }
1070
1071 fn add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
1072 (self.0)().add_error(errors);
1073 }
1074
1075 fn add_committed_expected_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
1076 (self.0)().add_committed_expected_error(errors);
1077 }
1078}
1079
1080pub fn lazy<Input, P, R>(p: P) -> Lazy<P>
1089where
1090 Input: Stream,
1091 P: FnMut() -> R,
1092 R: Parser<Input>,
1093{
1094 Lazy(p)
1095}
1096
1097#[derive(Copy, Clone)]
1098pub struct Factory<P, R>(P, Option<R>);
1099
1100impl<P, R> Factory<P, R> {
1101 fn parser<Input>(&mut self, input: &mut Input) -> &mut R
1102 where
1103 P: FnMut(&mut Input) -> R,
1104 {
1105 if let Some(ref mut r) = self.1 {
1106 return r;
1107 }
1108 self.1 = Some((self.0)(input));
1109 self.1.as_mut().unwrap()
1110 }
1111}
1112
1113impl<Input, O, P, R> Parser<Input> for Factory<P, R>
1114where
1115 Input: Stream,
1116 P: FnMut(&mut Input) -> R,
1117 R: Parser<Input, Output = O>,
1118{
1119 type Output = O;
1120 type PartialState = R::PartialState;
1121
1122 parse_mode!(Input);
1123
1124 fn parse_mode_impl<M>(
1125 &mut self,
1126 mode: M,
1127 input: &mut Input,
1128 state: &mut Self::PartialState,
1129 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
1130 where
1131 M: ParseMode,
1132 {
1133 if mode.is_first() {
1136 self.1 = None;
1137 }
1138 self.parser(input).parse_mode_impl(mode, input, state)
1139 }
1140
1141 fn add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
1142 if let Some(parser) = &mut self.1 {
1143 parser.add_error(errors);
1144 }
1145 }
1146
1147 fn add_committed_expected_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
1148 if let Some(parser) = &mut self.1 {
1149 parser.add_committed_expected_error(errors);
1150 }
1151 }
1152}
1153
1154pub fn factory<Input, P, R>(p: P) -> Factory<P, R>
1171where
1172 Input: Stream,
1173 P: FnMut(&mut Input) -> R,
1174 R: Parser<Input>,
1175{
1176 Factory(p, None)
1177}
1178
1179mod internal {
1180 pub trait Sealed {}
1181}
1182
1183use self::internal::Sealed;
1184
1185pub trait StrLike: Sealed {
1186 fn from_utf8(&self) -> Option<&str>;
1187}
1188
1189#[cfg(feature = "alloc")]
1190impl Sealed for String {}
1191#[cfg(feature = "alloc")]
1192impl StrLike for String {
1193 fn from_utf8(&self) -> Option<&str> {
1194 Some(self)
1195 }
1196}
1197
1198impl<'a> Sealed for &'a str {}
1199impl<'a> StrLike for &'a str {
1200 fn from_utf8(&self) -> Option<&str> {
1201 Some(*self)
1202 }
1203}
1204
1205impl Sealed for str {}
1206impl StrLike for str {
1207 fn from_utf8(&self) -> Option<&str> {
1208 Some(self)
1209 }
1210}
1211
1212#[cfg(feature = "alloc")]
1213impl Sealed for Vec<u8> {}
1214#[cfg(feature = "alloc")]
1215impl StrLike for Vec<u8> {
1216 fn from_utf8(&self) -> Option<&str> {
1217 (**self).from_utf8()
1218 }
1219}
1220
1221impl<'a> Sealed for &'a [u8] {}
1222impl<'a> StrLike for &'a [u8] {
1223 fn from_utf8(&self) -> Option<&str> {
1224 (**self).from_utf8()
1225 }
1226}
1227
1228impl Sealed for [u8] {}
1229impl StrLike for [u8] {
1230 fn from_utf8(&self) -> Option<&str> {
1231 str::from_utf8(self).ok()
1232 }
1233}
1234
1235parser! {
1236pub struct FromStr;
1237type PartialState = P::PartialState;
1238
1239pub fn from_str[Input, O, P](parser: P)(Input) -> O
1273where [
1274 P: Parser<Input>,
1275 P::Output: StrLike,
1276 O: str::FromStr,
1277 O::Err: fmt::Display,
1278]
1279{
1280 parser.and_then(|r| {
1281 r.from_utf8()
1282 .ok_or_else(|| StreamErrorFor::<Input>::expected_static_message("UTF-8"))
1283 .and_then(|s| s.parse().map_err(StreamErrorFor::<Input>::message_format))
1284 })
1285}
1286}
1287
1288#[derive(Copy, Clone)]
1289pub struct Opaque<F, Input, O, S>(F, PhantomData<fn(&mut Input, &mut S) -> O>);
1290impl<Input, F, O, S> Parser<Input> for Opaque<F, Input, O, S>
1291where
1292 Input: Stream,
1293 S: Default,
1294 F: FnMut(&mut dyn FnMut(&mut dyn Parser<Input, Output = O, PartialState = S>)),
1295{
1296 type Output = O;
1297 type PartialState = S;
1298
1299 fn parse_stream(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error> {
1300 let mut x = None;
1301 (self.0)(&mut |parser| x = Some(parser.parse_stream(input)));
1302 x.expect("Parser")
1303 }
1304
1305 fn parse_lazy(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error> {
1306 let mut x = None;
1307 (self.0)(&mut |parser| x = Some(parser.parse_lazy(input)));
1308 x.expect("Parser")
1309 }
1310
1311 parse_mode!(Input);
1312
1313 fn parse_mode_impl<M>(
1314 &mut self,
1315 mode: M,
1316 input: &mut Input,
1317 state: &mut Self::PartialState,
1318 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
1319 where
1320 M: ParseMode,
1321 {
1322 let mut x = None;
1323 (self.0)(&mut |parser| {
1324 x = Some(if mode.is_first() {
1325 parser.parse_first(input, state)
1326 } else {
1327 parser.parse_partial(input, state)
1328 })
1329 });
1330 x.expect("Parser")
1331 }
1332
1333 fn add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
1334 (self.0)(&mut |parser| parser.add_error(errors));
1335 }
1336
1337 fn add_committed_expected_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
1338 (self.0)(&mut |parser| parser.add_committed_expected_error(errors));
1339 }
1340}
1341
1342pub type FnOpaque<Input, O, S = ()> =
1345 Opaque<fn(&mut dyn FnMut(&mut dyn Parser<Input, Output = O, PartialState = S>)), Input, O, S>;
1346
1347pub fn opaque<Input, F, O, S>(f: F) -> Opaque<F, Input, O, S>
1399where
1400 Input: Stream,
1401 S: Default,
1402 F: FnMut(&mut dyn FnMut(&mut dyn Parser<Input, Output = O, PartialState = S>)),
1403{
1404 Opaque(f, PhantomData)
1405}
1406
1407#[macro_export]
1411macro_rules! opaque {
1412 ($e: expr) => {
1413 $crate::opaque!($e,);
1414 };
1415 ($e: expr,) => {
1416 $crate::parser::combinator::opaque(
1417 move |f: &mut dyn FnMut(&mut $crate::Parser<_, Output = _, PartialState = _>)| {
1418 f(&mut $e)
1419 },
1420 )
1421 };
1422}
1423
1424pub struct InputConverter<InputInner, P, C>
1425where
1426 InputInner: Stream,
1427{
1428 pub parser: P,
1429 pub converter: C,
1430 pub _marker: PhantomData<fn(InputInner)>,
1431}
1432impl<Input, InputInner, P, C> Parser<Input> for InputConverter<InputInner, P, C>
1433where
1434 Input: Stream,
1435 InputInner: Stream,
1436 P: Parser<InputInner>,
1437 for<'c> C: Converter<'c, Input, InputInner = InputInner>,
1438{
1439 type Output = P::Output;
1440 type PartialState = P::PartialState;
1441
1442 parse_mode!(Input);
1443
1444 fn parse_mode_impl<M>(
1445 &mut self,
1446 mode: M,
1447 input: &mut Input,
1448 state: &mut Self::PartialState,
1449 ) -> ParseResult<Self::Output, Input::Error>
1450 where
1451 M: ParseMode,
1452 {
1453 let mut input_inner = match self.converter.convert(input) {
1454 Ok(x) => x,
1455 Err(err) => return PeekErr(err.into()),
1456 };
1457 self.parser
1458 .parse_mode(mode, &mut input_inner, state)
1459 .map_err(|err| self.converter.convert_error(input, err))
1460 }
1461}
1462
1463pub trait Converter<'a, Input>
1464where
1465 Input: Stream,
1466{
1467 type InputInner: Stream + 'a;
1468 fn convert(&mut self, input: &'a mut Input) -> Result<Self::InputInner, Input::Error>;
1469 fn convert_error(
1470 &mut self,
1471 input: &'a mut Input,
1472 error: <Self::InputInner as StreamOnce>::Error,
1473 ) -> Input::Error;
1474}
1475
1476impl<'a, Input, InputInner> Converter<'a, Input>
1477 for (
1478 fn(&'a mut Input) -> Result<InputInner, Input::Error>,
1479 fn(&'a mut Input, InputInner::Error) -> Input::Error,
1480 )
1481where
1482 Input: Stream,
1483 InputInner: Stream + 'a,
1484{
1485 type InputInner = InputInner;
1486 fn convert(&mut self, input: &'a mut Input) -> Result<InputInner, Input::Error> {
1487 (self.0)(input)
1488 }
1489 fn convert_error(&mut self, input: &'a mut Input, error: InputInner::Error) -> Input::Error {
1490 (self.1)(input, error)
1491 }
1492}
1493
1494pub fn input_converter<Input, InputInner, P, C>(
1495 parser: P,
1496 converter: C,
1497) -> InputConverter<InputInner, P, C>
1498where
1499 Input: Stream,
1500 InputInner: Stream,
1501 P: Parser<InputInner>,
1502 for<'c> C: Converter<'c, Input, InputInner = InputInner>,
1503{
1504 InputConverter {
1505 parser,
1506 converter,
1507 _marker: PhantomData,
1508 }
1509}
1510
1511#[derive(Clone)]
1512pub struct Spanned<P>(P);
1513impl<Input, P, Q> Parser<Input> for Spanned<P>
1514where
1515 P: Parser<Input>,
1516 Input: Stream<Position = Span<Q>>,
1517 Q: Ord + Clone,
1518{
1519 type Output = P::Output;
1520 type PartialState = P::PartialState;
1521
1522 parse_mode!(Input);
1523 #[inline]
1524 fn parse_mode_impl<M>(
1525 &mut self,
1526 mode: M,
1527 input: &mut Input,
1528 state: &mut Self::PartialState,
1529 ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
1530 where
1531 M: ParseMode,
1532 {
1533 let start = input.position().start;
1534 self.0.parse_mode(mode, input, state).map_err(|mut err| {
1535 let error_span = err.position();
1536 if error_span.start == error_span.end {
1539 let end = input.position().end;
1540 err.set_position(Span { start, end });
1541 }
1542 err
1543 })
1544 }
1545
1546 forward_parser!(Input, add_error, add_committed_expected_error, 0);
1547}
1548
1549pub fn spanned<Input, P>(p: P) -> Spanned<P>
1553where
1554 P: Parser<Input>,
1555 Input: Stream,
1556{
1557 Spanned(p)
1558}