nom/combinator/mod.rs
1//! General purpose combinators
2
3#![allow(unused_imports)]
4
5use core::marker::PhantomData;
6
7#[cfg(feature = "alloc")]
8use crate::lib::std::boxed::Box;
9
10use crate::error::{ErrorKind, FromExternalError, ParseError};
11use crate::internal::*;
12use crate::lib::std::borrow::Borrow;
13use crate::lib::std::convert::Into;
14#[cfg(feature = "std")]
15use crate::lib::std::fmt::Debug;
16use crate::lib::std::mem::transmute;
17use crate::lib::std::ops::{Range, RangeFrom, RangeTo};
18use crate::traits::{AsChar, Input, ParseTo};
19use crate::traits::{Compare, CompareResult, Offset};
20
21#[cfg(test)]
22mod tests;
23
24/// Return the remaining input.
25///
26/// ```rust
27/// # use nom::error::ErrorKind;
28/// use nom::combinator::rest;
29/// assert_eq!(rest::<_,(_, ErrorKind)>("abc"), Ok(("", "abc")));
30/// assert_eq!(rest::<_,(_, ErrorKind)>(""), Ok(("", "")));
31/// ```
32#[inline]
33pub fn rest<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
34where
35 T: Input,
36{
37 Ok(input.take_split(input.input_len()))
38}
39
40/// Return the length of the remaining input.
41///
42/// ```rust
43/// # use nom::error::ErrorKind;
44/// use nom::combinator::rest_len;
45/// assert_eq!(rest_len::<_,(_, ErrorKind)>("abc"), Ok(("abc", 3)));
46/// assert_eq!(rest_len::<_,(_, ErrorKind)>(""), Ok(("", 0)));
47/// ```
48#[inline]
49pub fn rest_len<T, E: ParseError<T>>(input: T) -> IResult<T, usize, E>
50where
51 T: Input,
52{
53 let len = input.input_len();
54 Ok((input, len))
55}
56
57/// Maps a function on the result of a parser.
58///
59/// ```rust
60/// use nom::{Err,error::ErrorKind, IResult, Parser};
61/// use nom::character::complete::digit1;
62/// use nom::combinator::map;
63/// # fn main() {
64///
65/// let mut parser = map(digit1, |s: &str| s.len());
66///
67/// // the parser will count how many characters were returned by digit1
68/// assert_eq!(parser.parse("123456"), Ok(("", 6)));
69///
70/// // this will fail if digit1 fails
71/// assert_eq!(parser.parse("abc"), Err(Err::Error(("abc", ErrorKind::Digit))));
72/// # }
73/// ```
74pub fn map<I, O, E: ParseError<I>, F, G>(parser: F, f: G) -> impl Parser<I, Output = O, Error = E>
75where
76 F: Parser<I, Error = E>,
77 G: FnMut(<F as Parser<I>>::Output) -> O,
78{
79 parser.map(f)
80}
81
82/// Applies a function returning a `Result` over the result of a parser.
83///
84/// ```rust
85/// # use nom::{Err,error::ErrorKind, IResult, Parser};
86/// use nom::character::complete::digit1;
87/// use nom::combinator::map_res;
88/// # fn main() {
89///
90/// let mut parse = map_res(digit1, |s: &str| s.parse::<u8>());
91///
92/// // the parser will convert the result of digit1 to a number
93/// assert_eq!(parse.parse("123"), Ok(("", 123)));
94///
95/// // this will fail if digit1 fails
96/// assert_eq!(parse.parse("abc"), Err(Err::Error(("abc", ErrorKind::Digit))));
97///
98/// // this will fail if the mapped function fails (a `u8` is too small to hold `123456`)
99/// assert_eq!(parse.parse("123456"), Err(Err::Error(("123456", ErrorKind::MapRes))));
100/// # }
101/// ```
102pub fn map_res<I: Clone, O, E: ParseError<I> + FromExternalError<I, E2>, E2, F, G>(
103 parser: F,
104 f: G,
105) -> impl Parser<I, Output = O, Error = E>
106where
107 F: Parser<I, Error = E>,
108 G: FnMut(<F as Parser<I>>::Output) -> Result<O, E2>,
109{
110 parser.map_res(f)
111}
112
113/// Applies a function returning an `Option` over the result of a parser.
114///
115/// ```rust
116/// # use nom::{Err,error::ErrorKind, IResult, Parser};
117/// use nom::character::complete::digit1;
118/// use nom::combinator::map_opt;
119/// # fn main() {
120///
121/// let mut parse = map_opt(digit1, |s: &str| s.parse::<u8>().ok());
122///
123/// // the parser will convert the result of digit1 to a number
124/// assert_eq!(parse.parse("123"), Ok(("", 123)));
125///
126/// // this will fail if digit1 fails
127/// assert_eq!(parse.parse("abc"), Err(Err::Error(("abc", ErrorKind::Digit))));
128///
129/// // this will fail if the mapped function fails (a `u8` is too small to hold `123456`)
130/// assert_eq!(parse.parse("123456"), Err(Err::Error(("123456", ErrorKind::MapOpt))));
131/// # }
132/// ```
133pub fn map_opt<I: Clone, O, E: ParseError<I>, F, G>(
134 parser: F,
135 f: G,
136) -> impl Parser<I, Output = O, Error = E>
137where
138 F: Parser<I, Error = E>,
139 G: FnMut(<F as Parser<I>>::Output) -> Option<O>,
140{
141 parser.map_opt(f)
142}
143
144/// Applies a parser over the result of another one.
145///
146/// ```rust
147/// # use nom::{Err,error::ErrorKind, IResult, Parser};
148/// use nom::character::complete::digit1;
149/// use nom::bytes::complete::take;
150/// use nom::combinator::map_parser;
151/// # fn main() {
152///
153/// let mut parse = map_parser(take(5u8), digit1);
154///
155/// assert_eq!(parse.parse("12345"), Ok(("", "12345")));
156/// assert_eq!(parse.parse("123ab"), Ok(("", "123")));
157/// assert_eq!(parse.parse("123"), Err(Err::Error(("123", ErrorKind::Eof))));
158/// # }
159/// ```
160pub fn map_parser<I, O, E: ParseError<I>, F, G>(
161 parser: F,
162 applied_parser: G,
163) -> impl Parser<I, Output = O, Error = E>
164where
165 F: Parser<I, Error = E>,
166 G: Parser<<F as Parser<I>>::Output, Output = O, Error = E>,
167{
168 parser.and_then(applied_parser)
169}
170
171/// Creates a new parser from the output of the first parser, then apply that parser over the rest of the input.
172///
173/// ```rust
174/// # use nom::{Err,error::ErrorKind, IResult, Parser};
175/// use nom::bytes::complete::take;
176/// use nom::number::complete::u8;
177/// use nom::combinator::flat_map;
178/// # fn main() {
179///
180/// let mut parse = flat_map(u8, take);
181///
182/// assert_eq!(parse.parse(&[2, 0, 1, 2][..]), Ok((&[2][..], &[0, 1][..])));
183/// assert_eq!(parse.parse(&[4, 0, 1, 2][..]), Err(Err::Error((&[0, 1, 2][..], ErrorKind::Eof))));
184/// # }
185/// ```
186pub fn flat_map<I, O, E: ParseError<I>, F, G, H>(
187 parser: F,
188 applied_parser: G,
189) -> impl Parser<I, Output = O, Error = E>
190where
191 F: Parser<I, Error = E>,
192 G: FnMut(<F as Parser<I>>::Output) -> H,
193 H: Parser<I, Output = O, Error = E>,
194{
195 parser.flat_map(applied_parser)
196}
197
198/// Optional parser, will return `None` on [`Err::Error`].
199///
200/// To chain an error up, see [`cut`].
201///
202/// ```rust
203/// # use nom::{Err,error::ErrorKind, IResult, Parser};
204/// use nom::combinator::opt;
205/// use nom::character::complete::alpha1;
206/// # fn main() {
207///
208/// fn parser(i: &str) -> IResult<&str, Option<&str>> {
209/// opt(alpha1).parse(i)
210/// }
211///
212/// assert_eq!(parser("abcd;"), Ok((";", Some("abcd"))));
213/// assert_eq!(parser("123;"), Ok(("123;", None)));
214/// # }
215/// ```
216pub fn opt<I: Clone, E: ParseError<I>, F>(
217 f: F,
218) -> impl Parser<I, Output = Option<<F as Parser<I>>::Output>, Error = E>
219where
220 F: Parser<I, Error = E>,
221{
222 Opt { parser: f }
223}
224
225/// Parser implementation for [opt]
226pub struct Opt<F> {
227 parser: F,
228}
229
230impl<I, F: Parser<I>> Parser<I> for Opt<F>
231where
232 I: Clone,
233{
234 type Output = Option<<F as Parser<I>>::Output>;
235
236 type Error = <F as Parser<I>>::Error;
237
238 #[inline(always)]
239 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
240 let i = input.clone();
241 match self
242 .parser
243 .process::<OutputM<OM::Output, Check, OM::Incomplete>>(input)
244 {
245 Ok((i, o)) => Ok((i, OM::Output::map(o, Some))),
246 Err(Err::Error(_)) => Ok((i, OM::Output::bind(|| None))),
247 Err(Err::Failure(e)) => Err(Err::Failure(e)),
248 Err(Err::Incomplete(i)) => Err(Err::Incomplete(i)),
249 }
250 }
251}
252
253/// Calls the parser if the condition is met.
254///
255/// ```rust
256/// # use nom::{Err, error::{Error, ErrorKind}, IResult, Parser};
257/// use nom::combinator::cond;
258/// use nom::character::complete::alpha1;
259/// # fn main() {
260///
261/// fn parser(b: bool, i: &str) -> IResult<&str, Option<&str>> {
262/// cond(b, alpha1).parse(i)
263/// }
264///
265/// assert_eq!(parser(true, "abcd;"), Ok((";", Some("abcd"))));
266/// assert_eq!(parser(false, "abcd;"), Ok(("abcd;", None)));
267/// assert_eq!(parser(true, "123;"), Err(Err::Error(Error::new("123;", ErrorKind::Alpha))));
268/// assert_eq!(parser(false, "123;"), Ok(("123;", None)));
269/// # }
270/// ```
271pub fn cond<I, E: ParseError<I>, F>(
272 b: bool,
273 f: F,
274) -> impl Parser<I, Output = Option<<F as Parser<I>>::Output>, Error = E>
275where
276 F: Parser<I, Error = E>,
277{
278 Cond {
279 parser: if b { Some(f) } else { None },
280 }
281}
282
283/// Parser implementation for [cond]
284pub struct Cond<F> {
285 parser: Option<F>,
286}
287
288impl<I, F> Parser<I> for Cond<F>
289where
290 F: Parser<I>,
291{
292 type Output = Option<<F as Parser<I>>::Output>;
293 type Error = <F as Parser<I>>::Error;
294
295 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
296 match &mut self.parser {
297 None => Ok((input, OM::Output::bind(|| None))),
298 Some(f) => f
299 .process::<OM>(input)
300 .map(|(i, o)| (i, OM::Output::map(o, Some))),
301 }
302 }
303}
304
305/// Tries to apply its parser without consuming the input.
306///
307/// ```rust
308/// # use nom::{Err,error::ErrorKind, IResult, Parser};
309/// use nom::combinator::peek;
310/// use nom::character::complete::alpha1;
311/// # fn main() {
312///
313/// let mut parser = peek(alpha1);
314///
315/// assert_eq!(parser.parse("abcd;"), Ok(("abcd;", "abcd")));
316/// assert_eq!(parser.parse("123;"), Err(Err::Error(("123;", ErrorKind::Alpha))));
317/// # }
318/// ```
319pub fn peek<I: Clone, F>(
320 parser: F,
321) -> impl Parser<I, Output = <F as Parser<I>>::Output, Error = <F as Parser<I>>::Error>
322where
323 F: Parser<I>,
324{
325 Peek { parser }
326}
327
328/// Parsr implementation for [peek]
329pub struct Peek<F> {
330 parser: F,
331}
332
333impl<I, F> Parser<I> for Peek<F>
334where
335 I: Clone,
336 F: Parser<I>,
337{
338 type Output = <F as Parser<I>>::Output;
339 type Error = <F as Parser<I>>::Error;
340
341 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
342 let i = input.clone();
343 match self.parser.process::<OM>(input) {
344 Ok((_, o)) => Ok((i, o)),
345 Err(e) => Err(e),
346 }
347 }
348}
349
350/// returns its input if it is at the end of input data
351///
352/// When we're at the end of the data, this combinator
353/// will succeed
354///
355/// ```
356/// # use std::str;
357/// # use nom::{Err, error::ErrorKind, IResult};
358/// # use nom::combinator::eof;
359///
360/// # fn main() {
361/// let parser = eof;
362/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Eof))));
363/// assert_eq!(parser(""), Ok(("", "")));
364/// # }
365/// ```
366pub fn eof<I: Input + Clone, E: ParseError<I>>(input: I) -> IResult<I, I, E> {
367 if input.input_len() == 0 {
368 let clone = input.clone();
369 Ok((input, clone))
370 } else {
371 Err(Err::Error(E::from_error_kind(input, ErrorKind::Eof)))
372 }
373}
374
375/// Transforms Incomplete into `Error`.
376///
377/// ```rust
378/// # use nom::{Err,error::ErrorKind, IResult, Parser};
379/// use nom::bytes::streaming::take;
380/// use nom::combinator::complete;
381/// # fn main() {
382///
383/// let mut parser = complete(take(5u8));
384///
385/// assert_eq!(parser.parse("abcdefg"), Ok(("fg", "abcde")));
386/// assert_eq!(parser.parse("abcd"), Err(Err::Error(("abcd", ErrorKind::Complete))));
387/// # }
388/// ```
389pub fn complete<I: Clone, O, E: ParseError<I>, F>(
390 parser: F,
391) -> impl Parser<I, Output = O, Error = E>
392where
393 F: Parser<I, Output = O, Error = E>,
394{
395 MakeComplete { parser }
396}
397
398/// Parser implementation for [complete]
399pub struct MakeComplete<F> {
400 parser: F,
401}
402
403impl<I, F> Parser<I> for MakeComplete<F>
404where
405 I: Clone,
406 F: Parser<I>,
407{
408 type Output = <F as Parser<I>>::Output;
409 type Error = <F as Parser<I>>::Error;
410
411 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
412 let i = input.clone();
413
414 match self
415 .parser
416 .process::<OutputM<OM::Output, OM::Error, Complete>>(input)
417 {
418 Err(Err::Incomplete(_)) => Err(Err::Error(OM::Error::bind(|| {
419 <F as Parser<I>>::Error::from_error_kind(i, ErrorKind::Complete)
420 }))),
421 Err(e) => Err(e),
422 Ok(o) => Ok(o),
423 }
424 }
425}
426
427/// Succeeds if all the input has been consumed by its child parser.
428///
429/// ```rust
430/// # use nom::{Err,error::ErrorKind, IResult, Parser};
431/// use nom::combinator::all_consuming;
432/// use nom::character::complete::alpha1;
433/// # fn main() {
434///
435/// let mut parser = all_consuming(alpha1);
436///
437/// assert_eq!(parser.parse("abcd"), Ok(("", "abcd")));
438/// assert_eq!(parser.parse("abcd;"),Err(Err::Error((";", ErrorKind::Eof))));
439/// assert_eq!(parser.parse("123abcd;"),Err(Err::Error(("123abcd;", ErrorKind::Alpha))));
440/// # }
441/// ```
442pub fn all_consuming<I, E: ParseError<I>, F>(
443 parser: F,
444) -> impl Parser<I, Output = <F as Parser<I>>::Output, Error = E>
445where
446 I: Input,
447 F: Parser<I, Error = E>,
448{
449 AllConsuming { parser }
450}
451
452/// Parser implementation for [all_consuming]
453pub struct AllConsuming<F> {
454 parser: F,
455}
456
457impl<I, F> Parser<I> for AllConsuming<F>
458where
459 I: Input,
460 F: Parser<I>,
461{
462 type Output = <F as Parser<I>>::Output;
463 type Error = <F as Parser<I>>::Error;
464
465 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
466 let (input, res) = self.parser.process::<OM>(input)?;
467 if input.input_len() == 0 {
468 Ok((input, res))
469 } else {
470 Err(Err::Error(OM::Error::bind(|| {
471 <F as Parser<I>>::Error::from_error_kind(input, ErrorKind::Eof)
472 })))
473 }
474 }
475}
476
477/// Returns the result of the child parser if it satisfies a verification function.
478///
479/// The verification function takes as argument a reference to the output of the
480/// parser.
481///
482/// ```rust
483/// # use nom::{Err,error::ErrorKind, IResult, Parser};
484/// use nom::combinator::verify;
485/// use nom::character::complete::alpha1;
486/// # fn main() {
487///
488/// let mut parser = verify(alpha1, |s: &str| s.len() == 4);
489///
490/// assert_eq!(parser.parse("abcd"), Ok(("", "abcd")));
491/// assert_eq!(parser.parse("abcde"), Err(Err::Error(("abcde", ErrorKind::Verify))));
492/// assert_eq!(parser.parse("123abcd;"),Err(Err::Error(("123abcd;", ErrorKind::Alpha))));
493/// # }
494/// ```
495pub fn verify<I: Clone, O2, E: ParseError<I>, F, G>(
496 first: F,
497 second: G,
498) -> impl Parser<I, Output = <F as Parser<I>>::Output, Error = E>
499where
500 F: Parser<I, Error = E>,
501 G: Fn(&O2) -> bool,
502 <F as Parser<I>>::Output: Borrow<O2>,
503 O2: ?Sized,
504{
505 Verify {
506 first,
507 second,
508 o2: PhantomData,
509 }
510}
511
512/// Parser iplementation for verify
513pub struct Verify<F, G, O2: ?Sized> {
514 first: F,
515 second: G,
516 o2: PhantomData<O2>,
517}
518
519impl<I, F: Parser<I>, G, O2> Parser<I> for Verify<F, G, O2>
520where
521 I: Clone,
522 G: Fn(&O2) -> bool,
523 <F as Parser<I>>::Output: Borrow<O2>,
524 O2: ?Sized,
525{
526 type Output = <F as Parser<I>>::Output;
527
528 type Error = <F as Parser<I>>::Error;
529
530 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
531 let (i, o) = self
532 .first
533 .process::<OutputM<Emit, OM::Error, OM::Incomplete>>(input.clone())?;
534
535 if (self.second)(o.borrow()) {
536 Ok((i, OM::Output::bind(|| o)))
537 } else {
538 Err(Err::Error(OM::Error::bind(move || {
539 let e: ErrorKind = ErrorKind::Verify;
540 <F as Parser<I>>::Error::from_error_kind(input, e)
541 })))
542 }
543 }
544}
545
546/// Returns the provided value if the child parser succeeds.
547///
548/// ```rust
549/// # use nom::{Err,error::ErrorKind, IResult, Parser};
550/// use nom::combinator::value;
551/// use nom::character::complete::alpha1;
552/// # fn main() {
553///
554/// let mut parser = value(1234, alpha1);
555///
556/// assert_eq!(parser.parse("abcd"), Ok(("", 1234)));
557/// assert_eq!(parser.parse("123abcd;"), Err(Err::Error(("123abcd;", ErrorKind::Alpha))));
558/// # }
559/// ```
560pub fn value<I, O1: Clone, E: ParseError<I>, F>(
561 val: O1,
562 parser: F,
563) -> impl Parser<I, Output = O1, Error = E>
564where
565 F: Parser<I, Error = E>,
566{
567 parser.map(move |_| val.clone())
568}
569
570/// Succeeds if the child parser returns an error.
571///
572/// ```rust
573/// # use nom::{Err,error::ErrorKind, IResult, Parser};
574/// use nom::combinator::not;
575/// use nom::character::complete::alpha1;
576/// # fn main() {
577///
578/// let mut parser = not(alpha1);
579///
580/// assert_eq!(parser.parse("123"), Ok(("123", ())));
581/// assert_eq!(parser.parse("abcd"), Err(Err::Error(("abcd", ErrorKind::Not))));
582/// # }
583/// ```
584pub fn not<I: Clone, E: ParseError<I>, F>(parser: F) -> impl Parser<I, Output = (), Error = E>
585where
586 F: Parser<I, Error = E>,
587{
588 Not { parser }
589}
590
591/// Parser implementation for [not]
592pub struct Not<F> {
593 parser: F,
594}
595
596impl<I, F> Parser<I> for Not<F>
597where
598 I: Clone,
599 F: Parser<I>,
600{
601 type Output = ();
602 type Error = <F as Parser<I>>::Error;
603
604 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
605 let i = input.clone();
606 match self.parser.process::<OM>(input) {
607 Ok(_) => Err(Err::Error(OM::Error::bind(|| {
608 <F as Parser<I>>::Error::from_error_kind(i, ErrorKind::Not)
609 }))),
610 Err(Err::Error(_)) => Ok((i, OM::Output::bind(|| ()))),
611 Err(e) => Err(e),
612 }
613 }
614}
615
616/// If the child parser was successful, return the consumed input as produced value.
617///
618/// ```rust
619/// # use nom::{Err,error::ErrorKind, IResult, Parser};
620/// use nom::combinator::recognize;
621/// use nom::character::complete::{char, alpha1};
622/// use nom::sequence::separated_pair;
623/// # fn main() {
624///
625/// let mut parser = recognize(separated_pair(alpha1, char(','), alpha1));
626///
627/// assert_eq!(parser.parse("abcd,efgh"), Ok(("", "abcd,efgh")));
628/// assert_eq!(parser.parse("abcd;"),Err(Err::Error((";", ErrorKind::Char))));
629/// # }
630/// ```
631pub fn recognize<I: Clone + Offset + Input, E: ParseError<I>, F>(
632 parser: F,
633) -> impl Parser<I, Output = I, Error = E>
634where
635 F: Parser<I, Error = E>,
636{
637 Recognize { parser }
638}
639
640/// Parser implementation for [recognize]
641pub struct Recognize<F> {
642 parser: F,
643}
644
645impl<I, F> Parser<I> for Recognize<F>
646where
647 I: Clone + Offset + Input,
648 F: Parser<I>,
649{
650 type Output = I;
651 type Error = <F as Parser<I>>::Error;
652
653 #[inline(always)]
654 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
655 let i = input.clone();
656 match self
657 .parser
658 .process::<OutputM<Check, OM::Error, OM::Incomplete>>(i)
659 {
660 Ok((i, _)) => {
661 let index = input.offset(&i);
662 Ok((i, OM::Output::bind(|| input.take(index))))
663 }
664 Err(e) => Err(e),
665 }
666 }
667}
668
669/// if the child parser was successful, return the consumed input with the output
670/// as a tuple. Functions similarly to [recognize](fn.recognize.html) except it
671/// returns the parser output as well.
672///
673/// This can be useful especially in cases where the output is not the same type
674/// as the input, or the input is a user defined type.
675///
676/// Returned tuple is of the format `(consumed input, produced output)`.
677///
678/// ```rust
679/// # use nom::{Err,error::ErrorKind, IResult, Parser};
680/// use nom::combinator::{consumed, value, recognize, map};
681/// use nom::character::complete::{char, alpha1};
682/// use nom::bytes::complete::tag;
683/// use nom::sequence::separated_pair;
684///
685/// fn inner_parser(input: &str) -> IResult<&str, bool> {
686/// value(true, tag("1234")).parse(input)
687/// }
688///
689/// # fn main() {
690///
691/// let mut consumed_parser = consumed(value(true, separated_pair(alpha1, char(','), alpha1)));
692///
693/// assert_eq!(consumed_parser.parse("abcd,efgh1"), Ok(("1", ("abcd,efgh", true))));
694/// assert_eq!(consumed_parser.parse("abcd;"),Err(Err::Error((";", ErrorKind::Char))));
695///
696///
697/// // the first output (representing the consumed input)
698/// // should be the same as that of the `recognize` parser.
699/// let mut recognize_parser = recognize(inner_parser);
700/// let mut consumed_parser = map(consumed(inner_parser), |(consumed, output)| consumed);
701///
702/// assert_eq!(recognize_parser.parse("1234"), consumed_parser.parse("1234"));
703/// assert_eq!(recognize_parser.parse("abcd"), consumed_parser.parse("abcd"));
704/// # }
705/// ```
706pub fn consumed<I, F, E>(
707 parser: F,
708) -> impl Parser<I, Output = (I, <F as Parser<I>>::Output), Error = E>
709where
710 I: Clone + Offset + Input,
711 E: ParseError<I>,
712 F: Parser<I, Error = E>,
713{
714 Consumed { parser }
715}
716
717/// Parser implementation for [consumed]
718pub struct Consumed<F> {
719 parser: F,
720}
721
722impl<I, F> Parser<I> for Consumed<F>
723where
724 I: Clone + Offset + Input,
725 F: Parser<I>,
726{
727 type Output = (I, <F as Parser<I>>::Output);
728 type Error = <F as Parser<I>>::Error;
729
730 #[inline(always)]
731 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
732 let i = input.clone();
733 match self.parser.process::<OM>(i) {
734 Ok((remaining, result)) => {
735 let index = input.offset(&remaining);
736
737 Ok((
738 remaining,
739 OM::Output::map(result, |res| {
740 let consumed = input.take(index);
741 (consumed, res)
742 }),
743 ))
744 }
745 Err(e) => Err(e),
746 }
747 }
748}
749
750/// Transforms an [`Err::Error`] (recoverable) to [`Err::Failure`] (unrecoverable)
751///
752/// This commits the parse result, preventing alternative branch paths like with
753/// [`nom::branch::alt`][crate::branch::alt].
754///
755/// # Example
756///
757/// Without `cut`:
758/// ```rust
759/// # use nom::{Err,error::ErrorKind, IResult, Parser};
760/// # use nom::character::complete::{one_of, digit1};
761/// # use nom::combinator::rest;
762/// # use nom::branch::alt;
763/// # use nom::sequence::preceded;
764/// # fn main() {
765///
766/// fn parser(input: &str) -> IResult<&str, &str> {
767/// alt((
768/// preceded(one_of("+-"), digit1),
769/// rest
770/// )).parse(input)
771/// }
772///
773/// assert_eq!(parser("+10 ab"), Ok((" ab", "10")));
774/// assert_eq!(parser("ab"), Ok(("", "ab")));
775/// assert_eq!(parser("+"), Ok(("", "+")));
776/// # }
777/// ```
778///
779/// With `cut`:
780/// ```rust
781/// # use nom::{Err,error::ErrorKind, IResult, Parser, error::Error};
782/// # use nom::character::complete::{one_of, digit1};
783/// # use nom::combinator::rest;
784/// # use nom::branch::alt;
785/// # use nom::sequence::preceded;
786/// use nom::combinator::cut;
787/// # fn main() {
788///
789/// fn parser(input: &str) -> IResult<&str, &str> {
790/// alt((
791/// preceded(one_of("+-"), cut(digit1)),
792/// rest
793/// )).parse(input)
794/// }
795///
796/// assert_eq!(parser("+10 ab"), Ok((" ab", "10")));
797/// assert_eq!(parser("ab"), Ok(("", "ab")));
798/// assert_eq!(parser("+"), Err(Err::Failure(Error { input: "", code: ErrorKind::Digit })));
799/// # }
800/// ```
801pub fn cut<I, E: ParseError<I>, F>(
802 parser: F,
803) -> impl Parser<I, Output = <F as Parser<I>>::Output, Error = E>
804where
805 F: Parser<I, Error = E>,
806{
807 Cut { parser }
808}
809
810/// Parser implementation for [cut]
811pub struct Cut<F> {
812 parser: F,
813}
814
815impl<I, F> Parser<I> for Cut<F>
816where
817 F: Parser<I>,
818{
819 type Output = <F as Parser<I>>::Output;
820
821 type Error = <F as Parser<I>>::Error;
822
823 #[inline(always)]
824 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
825 match self
826 .parser
827 .process::<OutputM<OM::Output, Emit, OM::Incomplete>>(input)
828 {
829 Err(Err::Error(e)) => Err(Err::Failure(e)),
830 Err(Err::Failure(e)) => Err(Err::Failure(e)),
831 Err(Err::Incomplete(i)) => Err(Err::Incomplete(i)),
832 Ok((i, o)) => Ok((i, o)),
833 }
834 }
835}
836
837/// automatically converts the child parser's result to another type
838///
839/// it will be able to convert the output value and the error value
840/// as long as the `Into` implementations are available
841///
842/// ```rust
843/// # use nom::{IResult, Parser};
844/// use nom::combinator::into;
845/// use nom::character::complete::alpha1;
846/// # fn main() {
847///
848/// fn parser1(i: &str) -> IResult<&str, &str> {
849/// alpha1(i)
850/// }
851///
852/// let mut parser2 = into(parser1);
853///
854/// // the parser converts the &str output of the child parser into a Vec<u8>
855/// let bytes: IResult<&str, Vec<u8>> = parser2.parse("abcd");
856/// assert_eq!(bytes, Ok(("", vec![97, 98, 99, 100])));
857/// # }
858/// ```
859pub fn into<I, O1, O2, E1, E2, F>(parser: F) -> impl Parser<I, Output = O2, Error = E2>
860where
861 O2: From<O1>,
862 E2: From<E1>,
863 E1: ParseError<I>,
864 E2: ParseError<I>,
865 F: Parser<I, Output = O1, Error = E1>,
866{
867 parser.into::<O2, E2>()
868}
869
870/// Creates an iterator from input data and a parser.
871///
872/// Call the iterator's [ParserIterator::finish] method to get the remaining input if successful,
873/// or the error value if we encountered an error.
874///
875/// On [`Err::Error`], iteration will stop. To instead chain an error up, see [`cut`].
876///
877/// ```rust
878/// use nom::{combinator::iterator, IResult, bytes::complete::tag, character::complete::alpha1, sequence::terminated};
879/// use std::collections::HashMap;
880///
881/// let data = "abc|defg|hijkl|mnopqr|123";
882/// let mut it = iterator(data, terminated(alpha1, tag("|")));
883///
884/// let parsed = it.by_ref().map(|v| (v, v.len())).collect::<HashMap<_,_>>();
885/// let res: IResult<_,_> = it.finish();
886///
887/// assert_eq!(parsed, [("abc", 3usize), ("defg", 4), ("hijkl", 5), ("mnopqr", 6)].iter().cloned().collect());
888/// assert_eq!(res, Ok(("123", ())));
889/// ```
890pub fn iterator<Input, Error, F>(input: Input, f: F) -> ParserIterator<Input, Error, F>
891where
892 F: Parser<Input>,
893 Error: ParseError<Input>,
894{
895 ParserIterator {
896 iterator: f,
897 input,
898 state: Some(State::Running),
899 }
900}
901
902/// Main structure associated to the [iterator] function.
903pub struct ParserIterator<I, E, F> {
904 iterator: F,
905 input: I,
906 state: Option<State<E>>,
907}
908
909impl<I: Clone, E, F> ParserIterator<I, E, F> {
910 /// Returns the remaining input if parsing was successful, or the error if we encountered an error.
911 pub fn finish(mut self) -> IResult<I, (), E> {
912 match self.state.take().unwrap() {
913 State::Running | State::Done => Ok((self.input, ())),
914 State::Failure(e) => Err(Err::Failure(e)),
915 State::Incomplete(i) => Err(Err::Incomplete(i)),
916 }
917 }
918}
919
920impl<Input, Output, Error, F> core::iter::Iterator for ParserIterator<Input, Error, F>
921where
922 F: Parser<Input, Output = Output, Error = Error>,
923 Input: Clone,
924{
925 type Item = Output;
926
927 fn next(&mut self) -> Option<Self::Item> {
928 if let State::Running = self.state.take().unwrap() {
929 let input = self.input.clone();
930
931 match (self.iterator).parse(input) {
932 Ok((i, o)) => {
933 self.input = i;
934 self.state = Some(State::Running);
935 Some(o)
936 }
937 Err(Err::Error(_)) => {
938 self.state = Some(State::Done);
939 None
940 }
941 Err(Err::Failure(e)) => {
942 self.state = Some(State::Failure(e));
943 None
944 }
945 Err(Err::Incomplete(i)) => {
946 self.state = Some(State::Incomplete(i));
947 None
948 }
949 }
950 } else {
951 None
952 }
953 }
954}
955
956enum State<E> {
957 Running,
958 Done,
959 Failure(E),
960 Incomplete(Needed),
961}
962
963/// a parser which always succeeds with given value without consuming any input.
964///
965/// It can be used for example as the last alternative in `alt` to
966/// specify the default case.
967///
968/// ```rust
969/// # use nom::{Err,error::ErrorKind, IResult, Parser};
970/// use nom::branch::alt;
971/// use nom::combinator::{success, value};
972/// use nom::character::complete::char;
973/// # fn main() {
974///
975/// let mut parser = success::<_,_,(_,ErrorKind)>(10);
976/// assert_eq!(parser.parse("xyz"), Ok(("xyz", 10)));
977///
978/// let mut sign = alt((value(-1, char('-')), value(1, char('+')), success::<_,_,(_,ErrorKind)>(1)));
979/// assert_eq!(sign.parse("+10"), Ok(("10", 1)));
980/// assert_eq!(sign.parse("-10"), Ok(("10", -1)));
981/// assert_eq!(sign.parse("10"), Ok(("10", 1)));
982/// # }
983/// ```
984pub fn success<I, O: Clone, E: ParseError<I>>(val: O) -> impl Parser<I, Output = O, Error = E> {
985 Success {
986 val,
987 e: PhantomData,
988 }
989}
990
991/// Parser implementation for [success]
992pub struct Success<O: Clone, E> {
993 val: O,
994 e: PhantomData<E>,
995}
996
997impl<I, O, E> Parser<I> for Success<O, E>
998where
999 O: Clone,
1000 E: ParseError<I>,
1001{
1002 type Output = O;
1003 type Error = E;
1004
1005 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
1006 Ok((input, OM::Output::bind(|| self.val.clone())))
1007 }
1008}
1009
1010/// A parser which always fails.
1011///
1012/// ```rust
1013/// # use nom::{Err, error::ErrorKind, IResult, Parser};
1014/// use nom::combinator::fail;
1015///
1016/// let s = "string";
1017/// assert_eq!(fail::<_, &str, _>().parse(s), Err(Err::Error((s, ErrorKind::Fail))));
1018/// ```
1019pub fn fail<I, O, E: ParseError<I>>() -> impl Parser<I, Output = O, Error = E> {
1020 Fail {
1021 o: PhantomData,
1022 e: PhantomData,
1023 }
1024}
1025
1026/// Parser implementation for [fail]
1027pub struct Fail<O, E> {
1028 o: PhantomData<O>,
1029 e: PhantomData<E>,
1030}
1031
1032impl<I, O, E> Parser<I> for Fail<O, E>
1033where
1034 E: ParseError<I>,
1035{
1036 type Output = O;
1037 type Error = E;
1038
1039 fn process<OM: OutputMode>(&mut self, input: I) -> PResult<OM, I, Self::Output, Self::Error> {
1040 Err(Err::Error(OM::Error::bind(|| {
1041 E::from_error_kind(input, ErrorKind::Fail)
1042 })))
1043 }
1044}