1 //! Various combinators which do not fit anywhere else.
2 
3 use 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")]
16 use alloc::{boxed::Box, string::String, vec::Vec};
17 
18 #[cfg(feature = "alloc")]
19 use crate::lib::any::Any;
20 
21 #[derive(Copy, Clone)]
22 pub struct NotFollowedBy<P>(P);
23 impl<Input, O, P> Parser<Input> for NotFollowedBy<P>
24 where
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]
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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]
add_error(&mut self, _errors: &mut Tracked<<Input as StreamOnce>::Error>)52     fn add_error(&mut self, _errors: &mut Tracked<<Input as StreamOnce>::Error>) {}
53 
add_committed_expected_error(&mut self, _error: &mut Tracked<<Input as StreamOnce>::Error>)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 
60 /// Succeeds only if `parser` fails.
61 /// Never consumes any input.
62 ///
63 /// ```
64 /// # extern crate combine;
65 /// # use combine::*;
66 /// # use combine::parser::char::{alpha_num, string};
67 /// # fn main() {
68 /// let result = string("let")
69 ///     .skip(not_followed_by(alpha_num()))
70 ///     .parse("letx")
71 ///     .map(|x| x.0);
72 /// assert!(result.is_err());
73 ///
74 /// # }
75 /// ```
not_followed_by<Input, P>(parser: P) -> NotFollowedBy<P> where Input: Stream, P: Parser<Input>, P::Output: Into<Info<<Input as StreamOnce>::Token, <Input as StreamOnce>::Range, &'static str>>,76 pub fn not_followed_by<Input, P>(parser: P) -> NotFollowedBy<P>
77 where
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 /*
86  * TODO :: Rename `Try` to `Attempt`
87  * Because this is public, it's name cannot be changed without also making a breaking change.
88  */
89 #[derive(Copy, Clone)]
90 pub struct Try<P>(P);
91 impl<Input, O, P> Parser<Input> for Try<P>
92 where
93     Input: Stream,
94     P: Parser<Input, Output = O>,
95 {
96     type Output = O;
97     type PartialState = P::PartialState;
98 
99     #[inline]
parse_stream(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error>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]
parse_committed_mode<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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]
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 
143 /// `attempt(p)` behaves as `p` except it always acts as `p` peeked instead of committed on its
144 /// parse.
145 ///
146 /// ```
147 /// # extern crate combine;
148 /// # use combine::*;
149 /// # use combine::parser::char::string;
150 /// # fn main() {
151 /// let mut p = attempt(string("let"))
152 ///     .or(string("lex"));
153 /// let result = p.parse("lex").map(|x| x.0);
154 /// assert_eq!(result, Ok("lex"));
155 /// let result = p.parse("aet").map(|x| x.0);
156 /// assert!(result.is_err());
157 /// # }
158 /// ```
attempt<Input, P>(p: P) -> Try<P> where Input: Stream, P: Parser<Input>,159 pub fn attempt<Input, P>(p: P) -> Try<P>
160 where
161     Input: Stream,
162     P: Parser<Input>,
163 {
164     Try(p)
165 }
166 
167 #[derive(Copy, Clone)]
168 pub struct LookAhead<P>(P);
169 
170 impl<Input, O, P> Parser<Input> for LookAhead<P>
171 where
172     Input: Stream,
173     P: Parser<Input, Output = O>,
174 {
175     type Output = O;
176     type PartialState = ();
177 
178     #[inline]
parse_lazy(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error>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 
190 /// `look_ahead(p)` acts as `p` but doesn't consume input on success.
191 ///
192 /// ```
193 /// # extern crate combine;
194 /// # use combine::*;
195 /// # use combine::parser::char::string;
196 /// # fn main() {
197 /// let mut p = look_ahead(string("test"));
198 ///
199 /// let result = p.parse("test str");
200 /// assert_eq!(result, Ok(("test", "test str")));
201 ///
202 /// let result = p.parse("aet");
203 /// assert!(result.is_err());
204 /// # }
205 /// ```
look_ahead<Input, P>(p: P) -> LookAhead<P> where Input: Stream, P: Parser<Input>,206 pub fn look_ahead<Input, P>(p: P) -> LookAhead<P>
207 where
208     Input: Stream,
209     P: Parser<Input>,
210 {
211     LookAhead(p)
212 }
213 
214 #[derive(Copy, Clone)]
215 pub struct Map<P, F>(P, F);
216 impl<Input, A, B, P, F> Parser<Input> for Map<P, F>
217 where
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]
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 
247 /// Equivalent to [`p.map(f)`].
248 ///
249 /// [`p.map(f)`]: ../trait.Parser.html#method.map
map<Input, P, F, B>(p: P, f: F) -> Map<P, F> where Input: Stream, P: Parser<Input>, F: FnMut(P::Output) -> B,250 pub fn map<Input, P, F, B>(p: P, f: F) -> Map<P, F>
251 where
252     Input: Stream,
253     P: Parser<Input>,
254     F: FnMut(P::Output) -> B,
255 {
256     Map(p, f)
257 }
258 
259 #[derive(Copy, Clone)]
260 pub struct MapInput<P, F>(P, F);
261 impl<Input, A, B, P, F> Parser<Input> for MapInput<P, F>
262 where
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]
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 
292 /// Equivalent to [`p.map_input(f)`].
293 ///
294 /// [`p.map_input(f)`]: ../trait.Parser.html#method.map_input
map_input<Input, P, F, B>(p: P, f: F) -> MapInput<P, F> where Input: Stream, P: Parser<Input>, F: FnMut(P::Output, &mut Input) -> B,295 pub fn map_input<Input, P, F, B>(p: P, f: F) -> MapInput<P, F>
296 where
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)]
305 pub struct FlatMap<P, F>(P, F);
306 impl<Input, A, B, P, F> Parser<Input> for FlatMap<P, F>
307 where
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]
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 
343 /// Equivalent to [`p.flat_map(f)`].
344 ///
345 /// [`p.flat_map(f)`]: ../trait.Parser.html#method.flat_map
flat_map<Input, P, F, B>(p: P, f: F) -> FlatMap<P, F> where Input: Stream, P: Parser<Input>, F: FnMut(P::Output) -> Result<B, <Input as StreamOnce>::Error>,346 pub fn flat_map<Input, P, F, B>(p: P, f: F) -> FlatMap<P, F>
347 where
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)]
356 pub struct AndThen<P, F>(P, F);
357 impl<Input, P, F, O, E> Parser<Input> for AndThen<P, F>
358 where
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);
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 
413 /// Equivalent to [`p.and_then(f)`].
414 ///
415 /// [`p.and_then(f)`]: ../trait.Parser.html#method.and_then
and_then<Input, P, F, O, E>(p: P, f: F) -> AndThen<P, F> where P: Parser<Input>, F: FnMut(P::Output) -> Result<O, E>, Input: Stream, E: Into<<Input::Error as ParseError<Input::Token, Input::Range, Input::Position>>::StreamError>,416 pub fn and_then<Input, P, F, O, E>(p: P, f: F) -> AndThen<P, F>
417 where
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)]
427 pub struct Recognize<F, P>(P, PhantomData<fn() -> F>);
428 
429 impl<F, P> Recognize<F, P> {
430     #[inline]
recognize_result<Input>( elements: &mut F, before: <Input as ResetStream>::Checkpoint, input: &mut Input, result: ParseResult<P::Output, <Input as StreamOnce>::Error>, ) -> ParseResult<F, <Input as StreamOnce>::Error> where P: Parser<Input>, Input: Stream, F: Default + Extend<Input::Token>,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 
499 impl<Input, P, F> Parser<Input> for Recognize<F, P>
500 where
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);
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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]
add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>)526     fn add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
527         self.0.add_error(errors)
528     }
529 }
530 
531 /// Constructs a parser which returns the tokens parsed by `parser` accumulated in
532 /// `F: Extend<Input::Token>` instead of `P::Output`.
533 ///
534 /// ```
535 /// use combine::Parser;
536 /// use combine::parser::{repeat::skip_many1, token::token, combinator::recognize, char::digit};
537 ///
538 /// let mut parser = recognize((skip_many1(digit()), token('.'), skip_many1(digit())));
539 /// assert_eq!(parser.parse("123.45"), Ok(("123.45".to_string(), "")));
540 /// assert_eq!(parser.parse("123.45"), Ok(("123.45".to_string(), "")));
541 /// ```
recognize<F, Input, P>(parser: P) -> Recognize<F, P> where Input: Stream, P: Parser<Input>, F: Default + Extend<<Input as StreamOnce>::Token>,542 pub fn recognize<F, Input, P>(parser: P) -> Recognize<F, P>
543 where
544     Input: Stream,
545     P: Parser<Input>,
546     F: Default + Extend<<Input as StreamOnce>::Token>,
547 {
548     Recognize(parser, PhantomData)
549 }
550 
551 pub enum Either<L, R> {
552     Left(L),
553     Right(R),
554 }
555 
556 impl<Input, L, R> Parser<Input> for Either<L, R>
557 where
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]
parse_lazy( &mut self, input: &mut Input, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>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]
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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]
add_error(&mut self, error: &mut Tracked<<Input as StreamOnce>::Error>)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 
632 pub struct NoPartial<P>(P);
633 
634 impl<Input, P> Parser<Input> for NoPartial<P>
635 where
636     Input: Stream,
637     P: Parser<Input>,
638 {
639     type Output = <P as Parser<Input>>::Output;
640     type PartialState = ();
641 
642     #[inline]
parse_lazy( &mut self, input: &mut Input, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>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]
parse_mode_impl<M>( &mut self, _mode: M, input: &mut Input, _state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 
no_partial<Input, P>(p: P) -> NoPartial<P> where Input: Stream, P: Parser<Input>,667 pub fn no_partial<Input, P>(p: P) -> NoPartial<P>
668 where
669     Input: Stream,
670     P: Parser<Input>,
671 {
672     NoPartial(p)
673 }
674 
675 #[derive(Copy, Clone)]
676 pub struct Ignore<P>(P);
677 impl<Input, P> Parser<Input> for Ignore<P>
678 where
679     Input: Stream,
680     P: Parser<Input>,
681 {
682     type Output = ();
683     type PartialState = P::PartialState;
684 
685     #[inline]
parse_lazy( &mut self, input: &mut Input, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>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]
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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)]
ignore<Input, P>(p: P) -> Ignore<P> where Input: Stream, P: Parser<Input>,711 pub fn ignore<Input, P>(p: P) -> Ignore<P>
712 where
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)]
722 pub struct AnyPartialState(Option<Box<dyn Any>>);
723 
724 #[cfg(feature = "alloc")]
725 #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
726 pub struct AnyPartialStateParser<P>(P);
727 
728 #[cfg(feature = "alloc")]
729 impl<Input, P> Parser<Input> for AnyPartialStateParser<P>
730 where
731     Input: Stream,
732     P: Parser<Input>,
733     P::PartialState: 'static,
734 {
735     type Output = P::Output;
736     type PartialState = AnyPartialState;
737 
738     #[inline]
parse_lazy( &mut self, input: &mut Input, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>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]
parse_mode<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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                 // FIXME Make None unreachable for LLVM
773                 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 /// Returns a parser where `P::PartialState` is boxed. Useful as a way to avoid writing the type
784 /// since it can get very large after combining a few parsers.
785 ///
786 /// ```
787 /// # #[macro_use]
788 /// # extern crate combine;
789 /// # use combine::parser::combinator::{AnyPartialState, any_partial_state};
790 /// # use combine::parser::char::letter;
791 /// # use combine::*;
792 ///
793 /// # fn main() {
794 ///
795 /// parser! {
796 ///     type PartialState = AnyPartialState;
797 ///     fn example[Input]()(Input) -> (char, char)
798 ///     where [ Input: Stream<Token = char> ]
799 ///     {
800 ///         any_partial_state((letter(), letter()))
801 ///     }
802 /// }
803 ///
804 /// assert_eq!(
805 ///     example().easy_parse("ab"),
806 ///     Ok((('a', 'b'), ""))
807 /// );
808 ///
809 /// # }
810 /// ```
811 #[cfg(feature = "alloc")]
812 #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
any_partial_state<Input, P>(p: P) -> AnyPartialStateParser<P> where Input: Stream, P: Parser<Input>, P::PartialState: 'static,813 pub fn any_partial_state<Input, P>(p: P) -> AnyPartialStateParser<P>
814 where
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)]
825 pub struct AnySendPartialState(Option<Box<dyn Any + Send>>);
826 
827 #[cfg(feature = "alloc")]
828 #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
829 pub struct AnySendPartialStateParser<P>(P);
830 
831 #[cfg(feature = "alloc")]
832 impl<Input, P> Parser<Input> for AnySendPartialStateParser<P>
833 where
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]
parse_lazy( &mut self, input: &mut Input, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>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]
parse_mode<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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                 // FIXME Make None unreachable for LLVM
876                 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 /// Returns a parser where `P::PartialState` is boxed. Useful as a way to avoid writing the type
887 /// since it can get very large after combining a few parsers.
888 ///
889 /// ```
890 /// # #[macro_use]
891 /// # extern crate combine;
892 /// # use combine::parser::combinator::{AnySendPartialState, any_send_partial_state};
893 /// # use combine::parser::char::letter;
894 /// # use combine::*;
895 ///
896 /// # fn main() {
897 ///
898 /// parser! {
899 ///     type PartialState = AnySendPartialState;
900 ///     fn example[Input]()(Input) -> (char, char)
901 ///     where [ Input: Stream<Token = char> ]
902 ///     {
903 ///         any_send_partial_state((letter(), letter()))
904 ///     }
905 /// }
906 ///
907 /// assert_eq!(
908 ///     example().easy_parse("ab"),
909 ///     Ok((('a', 'b'), ""))
910 /// );
911 ///
912 /// # }
913 /// ```
914 #[cfg(feature = "alloc")]
915 #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
any_send_partial_state<Input, P>(p: P) -> AnySendPartialStateParser<P> where Input: Stream, P: Parser<Input>, P::PartialState: Send + 'static,916 pub fn any_send_partial_state<Input, P>(p: P) -> AnySendPartialStateParser<P>
917 where
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)]
928 pub struct AnySendSyncPartialState(Option<Box<dyn Any + Send + Sync>>);
929 
930 #[cfg(feature = "alloc")]
931 #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
932 pub struct AnySendSyncPartialStateParser<P>(P);
933 
934 #[cfg(feature = "alloc")]
935 impl<Input, P> Parser<Input> for AnySendSyncPartialStateParser<P>
936 where
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]
parse_lazy( &mut self, input: &mut Input, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>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]
parse_mode<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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                 // FIXME Make None unreachable for LLVM
979                 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 /// Returns a parser where `P::PartialState` is boxed. Useful as a way to avoid writing the type
990 /// since it can get very large after combining a few parsers.
991 ///
992 /// ```
993 /// # #[macro_use]
994 /// # extern crate combine;
995 /// # use combine::parser::combinator::{AnySendSyncPartialState, any_send_sync_partial_state};
996 /// # use combine::parser::char::letter;
997 /// # use combine::*;
998 ///
999 /// # fn main() {
1000 ///
1001 /// fn example<Input>() -> impl Parser<Input, Output = (char, char), PartialState = AnySendSyncPartialState>
1002 /// where
1003 ///     Input: Stream<Token = char>,
1004 /// {
1005 ///     any_send_sync_partial_state((letter(), letter()))
1006 /// }
1007 ///
1008 /// assert_eq!(
1009 ///     example().easy_parse("ab"),
1010 ///     Ok((('a', 'b'), ""))
1011 /// );
1012 ///
1013 /// # }
1014 /// ```
1015 #[cfg(feature = "alloc")]
1016 #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
any_send_sync_partial_state<Input, P>(p: P) -> AnySendSyncPartialStateParser<P> where Input: Stream, P: Parser<Input>, P::PartialState: Send + Sync + 'static,1017 pub fn any_send_sync_partial_state<Input, P>(p: P) -> AnySendSyncPartialStateParser<P>
1018 where
1019     Input: Stream,
1020     P: Parser<Input>,
1021     P::PartialState: Send + Sync + 'static,
1022 {
1023     AnySendSyncPartialStateParser(p)
1024 }
1025 
1026 #[derive(Copy, Clone)]
1027 pub struct Lazy<P>(P);
1028 impl<Input, O, P, R> Parser<Input> for Lazy<P>
1029 where
1030     Input: Stream,
1031     P: FnMut() -> R,
1032     R: Parser<Input, Output = O>,
1033 {
1034     type Output = O;
1035     type PartialState = R::PartialState;
1036 
parse_stream(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error>1037     fn parse_stream(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error> {
1038         (self.0)().parse_stream(input)
1039     }
1040 
parse_lazy(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error>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 
parse_committed_mode<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 
add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>)1071     fn add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
1072         (self.0)().add_error(errors);
1073     }
1074 
add_committed_expected_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>)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 
1080 /// Constructs the parser lazily on each `parse_*` call. Can be used to effectively reduce the
1081 /// size of deeply nested parsers as only the function producing the parser is stored.
1082 ///
1083 /// NOTE: Expects that the parser returned is always the same one, if that is not the case the
1084 /// reported error may be wrong. If different parsers may be returned, use the [`factory`][] parser
1085 /// instead.
1086 ///
1087 /// [`factory`]: fn.factory.html
lazy<Input, P, R>(p: P) -> Lazy<P> where Input: Stream, P: FnMut() -> R, R: Parser<Input>,1088 pub fn lazy<Input, P, R>(p: P) -> Lazy<P>
1089 where
1090     Input: Stream,
1091     P: FnMut() -> R,
1092     R: Parser<Input>,
1093 {
1094     Lazy(p)
1095 }
1096 
1097 #[derive(Copy, Clone)]
1098 pub struct Factory<P, R>(P, Option<R>);
1099 
1100 impl<P, R> Factory<P, R> {
parser<Input>(&mut self, input: &mut Input) -> &mut R where P: FnMut(&mut Input) -> 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 
1113 impl<Input, O, P, R> Parser<Input> for Factory<P, R>
1114 where
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 
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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         // Always ask for a new parser except if we are in a partial call being resumed as we want
1134         // to resume the same parser then
1135         if mode.is_first() {
1136             self.1 = None;
1137         }
1138         self.parser(input).parse_mode_impl(mode, input, state)
1139     }
1140 
add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>)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 
add_committed_expected_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>)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 
1154 /// Constructs the parser lazily on each `parse_*` call. This is similar to [`lazy`][] but it
1155 /// takes `Input` as an argument and allows different parsers to be returned on each call to
1156 /// `p` while still reporting the correct errors.
1157 ///
1158 /// [`lazy`]: fn.lazy.html
1159 ///
1160 /// ```
1161 /// # use combine::*;
1162 /// # use combine::parser::char::{digit, letter};
1163 /// # use combine::parser::combinator::{FnOpaque, opaque, factory};
1164 ///
1165 /// let mut parsers: Vec<FnOpaque<_, _>> = vec![opaque(|f| f(&mut digit())), opaque(|f| f(&mut letter()))];
1166 /// let mut iter = parsers.into_iter().cycle();
1167 /// let mut parser = many(factory(move |_| iter.next().unwrap()));
1168 /// assert_eq!(parser.parse("1a2b3cd"), Ok(("1a2b3c".to_string(), "d")));
1169 /// ```
factory<Input, P, R>(p: P) -> Factory<P, R> where Input: Stream, P: FnMut(&mut Input) -> R, R: Parser<Input>,1170 pub fn factory<Input, P, R>(p: P) -> Factory<P, R>
1171 where
1172     Input: Stream,
1173     P: FnMut(&mut Input) -> R,
1174     R: Parser<Input>,
1175 {
1176     Factory(p, None)
1177 }
1178 
1179 mod internal {
1180     pub trait Sealed {}
1181 }
1182 
1183 use self::internal::Sealed;
1184 
1185 pub trait StrLike: Sealed {
from_utf8(&self) -> Option<&str>1186     fn from_utf8(&self) -> Option<&str>;
1187 }
1188 
1189 #[cfg(feature = "alloc")]
1190 impl Sealed for String {}
1191 #[cfg(feature = "alloc")]
1192 impl StrLike for String {
from_utf8(&self) -> Option<&str>1193     fn from_utf8(&self) -> Option<&str> {
1194         Some(self)
1195     }
1196 }
1197 
1198 impl<'a> Sealed for &'a str {}
1199 impl<'a> StrLike for &'a str {
from_utf8(&self) -> Option<&str>1200     fn from_utf8(&self) -> Option<&str> {
1201         Some(*self)
1202     }
1203 }
1204 
1205 impl Sealed for str {}
1206 impl StrLike for str {
from_utf8(&self) -> Option<&str>1207     fn from_utf8(&self) -> Option<&str> {
1208         Some(self)
1209     }
1210 }
1211 
1212 #[cfg(feature = "alloc")]
1213 impl Sealed for Vec<u8> {}
1214 #[cfg(feature = "alloc")]
1215 impl StrLike for Vec<u8> {
from_utf8(&self) -> Option<&str>1216     fn from_utf8(&self) -> Option<&str> {
1217         (**self).from_utf8()
1218     }
1219 }
1220 
1221 impl<'a> Sealed for &'a [u8] {}
1222 impl<'a> StrLike for &'a [u8] {
from_utf8(&self) -> Option<&str>1223     fn from_utf8(&self) -> Option<&str> {
1224         (**self).from_utf8()
1225     }
1226 }
1227 
1228 impl Sealed for [u8] {}
1229 impl StrLike for [u8] {
from_utf8(&self) -> Option<&str>1230     fn from_utf8(&self) -> Option<&str> {
1231         str::from_utf8(self).ok()
1232     }
1233 }
1234 
1235 parser! {
1236 pub struct FromStr;
1237 type PartialState = P::PartialState;
1238 
1239 /// Takes a parser that outputs a string like value (`&str`, `String`, `&[u8]` or `Vec<u8>`) and parses it
1240 /// using `std::str::FromStr`. Errors if the output of `parser` is not UTF-8 or if
1241 /// `FromStr::from_str` returns an error.
1242 ///
1243 /// ```
1244 /// # extern crate combine;
1245 /// # use combine::parser::range;
1246 /// # use combine::parser::repeat::many1;
1247 /// # use combine::parser::combinator::from_str;
1248 /// # use combine::parser::char;
1249 /// # use combine::parser::byte;
1250 /// # use combine::*;
1251 /// # fn main() {
1252 /// let mut parser = from_str(many1::<String, _, _>(char::digit()));
1253 /// let result = parser.parse("12345\r\n");
1254 /// assert_eq!(result, Ok((12345i32, "\r\n")));
1255 ///
1256 /// // Range parsers work as well
1257 /// let mut parser = from_str(range::take_while1(|c: char| c.is_digit(10)));
1258 /// let result = parser.parse("12345\r\n");
1259 /// assert_eq!(result, Ok((12345i32, "\r\n")));
1260 ///
1261 /// // As do parsers that work with bytes
1262 /// let digits = || range::take_while1(|b: u8| b >= b'0' && b <= b'9');
1263 /// let mut parser = from_str(range::recognize((
1264 ///     digits(),
1265 ///     byte::byte(b'.'),
1266 ///     digits(),
1267 /// )));
1268 /// let result = parser.parse(&b"123.45\r\n"[..]);
1269 /// assert_eq!(result, Ok((123.45f64, &b"\r\n"[..])));
1270 /// # }
1271 /// ```
1272 pub fn from_str[Input, O, P](parser: P)(Input) -> O
1273 where [
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)]
1289 pub struct Opaque<F, Input, O, S>(F, PhantomData<fn(&mut Input, &mut S) -> O>);
1290 impl<Input, F, O, S> Parser<Input> for Opaque<F, Input, O, S>
1291 where
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 
parse_stream(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error>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 
parse_lazy(&mut self, input: &mut Input) -> ParseResult<O, <Input as StreamOnce>::Error>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 
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 
add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>)1333     fn add_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>) {
1334         (self.0)(&mut |parser| parser.add_error(errors));
1335     }
1336 
add_committed_expected_error(&mut self, errors: &mut Tracked<<Input as StreamOnce>::Error>)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 
1342 /// Alias over `Opaque` where the function can be a plain function pointer (does not need to
1343 /// capture any values)
1344 pub type FnOpaque<Input, O, S = ()> =
1345     Opaque<fn(&mut dyn FnMut(&mut dyn Parser<Input, Output = O, PartialState = S>)), Input, O, S>;
1346 
1347 /// Creates a parser from a function which takes a function that are given the actual parser.
1348 /// Though convoluted this makes it possible to hide the concrete parser type without `Box` or
1349 /// losing the full information about the parser as is the case of [`parser`][].
1350 ///
1351 /// Since this hides the type this can also be useful for writing mutually recursive `impl Parser`
1352 /// parsers to break the otherwise arbitrarily large type that rustc creates internally.
1353 ///
1354 /// If you need a more general version (that does not need trait objects) try the [`parser!`][]
1355 /// macro.
1356 ///
1357 /// ```
1358 /// # #[macro_use]
1359 /// # extern crate combine;
1360 /// # use combine::parser::combinator::{FnOpaque, no_partial};
1361 /// # use combine::parser::char::{char, digit};
1362 /// # use combine::*;
1363 ///
1364 /// # fn main() {
1365 ///
1366 /// #[derive(PartialEq, Debug)]
1367 /// enum Expr {
1368 ///     Number(i64),
1369 ///     Pair(Box<Expr>, Box<Expr>),
1370 /// }
1371 ///
1372 /// fn expr<Input>() -> FnOpaque<Input, Expr>
1373 /// where
1374 ///     Input: Stream<Token = char>,
1375 /// {
1376 ///     opaque!(
1377 ///         // `no_partial` disables partial parsing and replaces the partial state with `()`,
1378 ///         // letting us avoid naming that type
1379 ///         no_partial(choice((
1380 ///             from_str(many1::<String, _, _>(digit()))
1381 ///                 .map(Expr::Number),
1382 ///             (char('('), expr(), char(','), expr(), char(')'))
1383 ///                 .map(|(_, l, _, r, _)| Expr::Pair(Box::new(l), Box::new(r)))
1384 ///         ))),
1385 ///     )
1386 /// }
1387 ///
1388 /// assert_eq!(
1389 ///     expr().easy_parse("123"),
1390 ///     Ok((Expr::Number(123), ""))
1391 /// );
1392 ///
1393 /// # }
1394 /// ```
1395 ///
1396 /// [`parser`]: ../function/fn.parser.html
1397 /// [`parser!`]: ../../macro.parser.html
opaque<Input, F, O, S>(f: F) -> Opaque<F, Input, O, S> where Input: Stream, S: Default, F: FnMut(&mut dyn FnMut(&mut dyn Parser<Input, Output = O, PartialState = S>)),1398 pub fn opaque<Input, F, O, S>(f: F) -> Opaque<F, Input, O, S>
1399 where
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 /// Convenience macro over [`opaque`][].
1408 ///
1409 /// [`opaque`]: parser/combinator/fn.opaque.html
1410 #[macro_export]
1411 macro_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 
1424 pub struct InputConverter<InputInner, P, C>
1425 where
1426     InputInner: Stream,
1427 {
1428     pub parser: P,
1429     pub converter: C,
1430     pub _marker: PhantomData<fn(InputInner)>,
1431 }
1432 impl<Input, InputInner, P, C> Parser<Input> for InputConverter<InputInner, P, C>
1433 where
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 
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, Input::Error> where M: ParseMode,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 
1463 pub trait Converter<'a, Input>
1464 where
1465     Input: Stream,
1466 {
1467     type InputInner: Stream + 'a;
convert(&mut self, input: &'a mut Input) -> Result<Self::InputInner, Input::Error>1468     fn convert(&mut self, input: &'a mut Input) -> Result<Self::InputInner, Input::Error>;
convert_error( &mut self, input: &'a mut Input, error: <Self::InputInner as StreamOnce>::Error, ) -> Input::Error1469     fn convert_error(
1470         &mut self,
1471         input: &'a mut Input,
1472         error: <Self::InputInner as StreamOnce>::Error,
1473     ) -> Input::Error;
1474 }
1475 
1476 impl<'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     )
1481 where
1482     Input: Stream,
1483     InputInner: Stream + 'a,
1484 {
1485     type InputInner = InputInner;
convert(&mut self, input: &'a mut Input) -> Result<InputInner, Input::Error>1486     fn convert(&mut self, input: &'a mut Input) -> Result<InputInner, Input::Error> {
1487         (self.0)(input)
1488     }
convert_error(&mut self, input: &'a mut Input, error: InputInner::Error) -> Input::Error1489     fn convert_error(&mut self, input: &'a mut Input, error: InputInner::Error) -> Input::Error {
1490         (self.1)(input, error)
1491     }
1492 }
1493 
input_converter<Input, InputInner, P, C>( parser: P, converter: C, ) -> InputConverter<InputInner, P, C> where Input: Stream, InputInner: Stream, P: Parser<InputInner>, for<'c> C: Converter<'c, Input, InputInner = InputInner>,1494 pub fn input_converter<Input, InputInner, P, C>(
1495     parser: P,
1496     converter: C,
1497 ) -> InputConverter<InputInner, P, C>
1498 where
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)]
1512 pub struct Spanned<P>(P);
1513 impl<Input, P, Q> Parser<Input> for Spanned<P>
1514 where
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]
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode,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 an inner `spanned` combinator has already attached its span that will be more
1537             // specific so only set a span if the current error has a position, not a span
1538             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 
1549 /// Equivalent to [`p.spanned()`].
1550 ///
1551 /// [`p.spanned()`]: ../trait.Parser.html#method.spanned
spanned<Input, P>(p: P) -> Spanned<P> where P: Parser<Input>, Input: Stream,1552 pub fn spanned<Input, P>(p: P) -> Spanned<P>
1553 where
1554     P: Parser<Input>,
1555     Input: Stream,
1556 {
1557     Spanned(p)
1558 }
1559