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