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` if not successful.
222 ///
223 /// ```rust
224 /// # use nom::{Err,error::ErrorKind, IResult};
225 /// use nom::combinator::opt;
226 /// use nom::character::complete::alpha1;
227 /// # fn main() {
228 ///
229 /// fn parser(i: &str) -> IResult<&str, Option<&str>> {
230 /// opt(alpha1)(i)
231 /// }
232 ///
233 /// assert_eq!(parser("abcd;"), Ok((";", Some("abcd"))));
234 /// assert_eq!(parser("123;"), Ok(("123;", None)));
235 /// # }
236 /// ```
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>,237 pub fn opt<I: Clone, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, Option<O>, E>
238 where
239 F: Parser<I, O, E>,
240 {
241 move |input: I| {
242 let i = input.clone();
243 match f.parse(input) {
244 Ok((i, o)) => Ok((i, Some(o))),
245 Err(Err::Error(_)) => Ok((i, None)),
246 Err(e) => Err(e),
247 }
248 }
249 }
250
251 /// Calls the parser if the condition is met.
252 ///
253 /// ```rust
254 /// # use nom::{Err, error::{Error, ErrorKind}, IResult};
255 /// use nom::combinator::cond;
256 /// use nom::character::complete::alpha1;
257 /// # fn main() {
258 ///
259 /// fn parser(b: bool, i: &str) -> IResult<&str, Option<&str>> {
260 /// cond(b, alpha1)(i)
261 /// }
262 ///
263 /// assert_eq!(parser(true, "abcd;"), Ok((";", Some("abcd"))));
264 /// assert_eq!(parser(false, "abcd;"), Ok(("abcd;", None)));
265 /// assert_eq!(parser(true, "123;"), Err(Err::Error(Error::new("123;", ErrorKind::Alpha))));
266 /// assert_eq!(parser(false, "123;"), Ok(("123;", None)));
267 /// # }
268 /// ```
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>,269 pub fn cond<I, O, E: ParseError<I>, F>(
270 b: bool,
271 mut f: F,
272 ) -> impl FnMut(I) -> IResult<I, Option<O>, E>
273 where
274 F: Parser<I, O, E>,
275 {
276 move |input: I| {
277 if b {
278 match f.parse(input) {
279 Ok((i, o)) => Ok((i, Some(o))),
280 Err(e) => Err(e),
281 }
282 } else {
283 Ok((input, None))
284 }
285 }
286 }
287
288 /// Tries to apply its parser without consuming the input.
289 ///
290 /// ```rust
291 /// # use nom::{Err,error::ErrorKind, IResult};
292 /// use nom::combinator::peek;
293 /// use nom::character::complete::alpha1;
294 /// # fn main() {
295 ///
296 /// let mut parser = peek(alpha1);
297 ///
298 /// assert_eq!(parser("abcd;"), Ok(("abcd;", "abcd")));
299 /// assert_eq!(parser("123;"), Err(Err::Error(("123;", ErrorKind::Alpha))));
300 /// # }
301 /// ```
peek<I: Clone, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, O, E> where F: Parser<I, O, E>,302 pub fn peek<I: Clone, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, O, E>
303 where
304 F: Parser<I, O, E>,
305 {
306 move |input: I| {
307 let i = input.clone();
308 match f.parse(input) {
309 Ok((_, o)) => Ok((i, o)),
310 Err(e) => Err(e),
311 }
312 }
313 }
314
315 /// returns its input if it is at the end of input data
316 ///
317 /// When we're at the end of the data, this combinator
318 /// will succeed
319 ///
320 /// ```
321 /// # use std::str;
322 /// # use nom::{Err, error::ErrorKind, IResult};
323 /// # use nom::combinator::eof;
324 ///
325 /// # fn main() {
326 /// let parser = eof;
327 /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Eof))));
328 /// assert_eq!(parser(""), Ok(("", "")));
329 /// # }
330 /// ```
eof<I: InputLength + Clone, E: ParseError<I>>(input: I) -> IResult<I, I, E>331 pub fn eof<I: InputLength + Clone, E: ParseError<I>>(input: I) -> IResult<I, I, E> {
332 if input.input_len() == 0 {
333 let clone = input.clone();
334 Ok((input, clone))
335 } else {
336 Err(Err::Error(E::from_error_kind(input, ErrorKind::Eof)))
337 }
338 }
339
340 /// Transforms Incomplete into `Error`.
341 ///
342 /// ```rust
343 /// # use nom::{Err,error::ErrorKind, IResult};
344 /// use nom::bytes::streaming::take;
345 /// use nom::combinator::complete;
346 /// # fn main() {
347 ///
348 /// let mut parser = complete(take(5u8));
349 ///
350 /// assert_eq!(parser("abcdefg"), Ok(("fg", "abcde")));
351 /// assert_eq!(parser("abcd"), Err(Err::Error(("abcd", ErrorKind::Complete))));
352 /// # }
353 /// ```
complete<I: Clone, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, O, E> where F: Parser<I, O, E>,354 pub fn complete<I: Clone, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, O, E>
355 where
356 F: Parser<I, O, E>,
357 {
358 move |input: I| {
359 let i = input.clone();
360 match f.parse(input) {
361 Err(Err::Incomplete(_)) => Err(Err::Error(E::from_error_kind(i, ErrorKind::Complete))),
362 rest => rest,
363 }
364 }
365 }
366
367 /// Succeeds if all the input has been consumed by its child parser.
368 ///
369 /// ```rust
370 /// # use nom::{Err,error::ErrorKind, IResult};
371 /// use nom::combinator::all_consuming;
372 /// use nom::character::complete::alpha1;
373 /// # fn main() {
374 ///
375 /// let mut parser = all_consuming(alpha1);
376 ///
377 /// assert_eq!(parser("abcd"), Ok(("", "abcd")));
378 /// assert_eq!(parser("abcd;"),Err(Err::Error((";", ErrorKind::Eof))));
379 /// assert_eq!(parser("123abcd;"),Err(Err::Error(("123abcd;", ErrorKind::Alpha))));
380 /// # }
381 /// ```
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>,382 pub fn all_consuming<I, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, O, E>
383 where
384 I: InputLength,
385 F: Parser<I, O, E>,
386 {
387 move |input: I| {
388 let (input, res) = f.parse(input)?;
389 if input.input_len() == 0 {
390 Ok((input, res))
391 } else {
392 Err(Err::Error(E::from_error_kind(input, ErrorKind::Eof)))
393 }
394 }
395 }
396
397 /// Returns the result of the child parser if it satisfies a verification function.
398 ///
399 /// The verification function takes as argument a reference to the output of the
400 /// parser.
401 ///
402 /// ```rust
403 /// # use nom::{Err,error::ErrorKind, IResult};
404 /// use nom::combinator::verify;
405 /// use nom::character::complete::alpha1;
406 /// # fn main() {
407 ///
408 /// let mut parser = verify(alpha1, |s: &str| s.len() == 4);
409 ///
410 /// assert_eq!(parser("abcd"), Ok(("", "abcd")));
411 /// assert_eq!(parser("abcde"), Err(Err::Error(("abcde", ErrorKind::Verify))));
412 /// assert_eq!(parser("123abcd;"),Err(Err::Error(("123abcd;", ErrorKind::Alpha))));
413 /// # }
414 /// ```
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,415 pub fn verify<I: Clone, O1, O2, E: ParseError<I>, F, G>(
416 mut first: F,
417 second: G,
418 ) -> impl FnMut(I) -> IResult<I, O1, E>
419 where
420 F: Parser<I, O1, E>,
421 G: Fn(&O2) -> bool,
422 O1: Borrow<O2>,
423 O2: ?Sized,
424 {
425 move |input: I| {
426 let i = input.clone();
427 let (input, o) = first.parse(input)?;
428
429 if second(o.borrow()) {
430 Ok((input, o))
431 } else {
432 Err(Err::Error(E::from_error_kind(i, ErrorKind::Verify)))
433 }
434 }
435 }
436
437 /// Returns the provided value if the child parser succeeds.
438 ///
439 /// ```rust
440 /// # use nom::{Err,error::ErrorKind, IResult};
441 /// use nom::combinator::value;
442 /// use nom::character::complete::alpha1;
443 /// # fn main() {
444 ///
445 /// let mut parser = value(1234, alpha1);
446 ///
447 /// assert_eq!(parser("abcd"), Ok(("", 1234)));
448 /// assert_eq!(parser("123abcd;"), Err(Err::Error(("123abcd;", ErrorKind::Alpha))));
449 /// # }
450 /// ```
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>,451 pub fn value<I, O1: Clone, O2, E: ParseError<I>, F>(
452 val: O1,
453 mut parser: F,
454 ) -> impl FnMut(I) -> IResult<I, O1, E>
455 where
456 F: Parser<I, O2, E>,
457 {
458 move |input: I| parser.parse(input).map(|(i, _)| (i, val.clone()))
459 }
460
461 /// Succeeds if the child parser returns an error.
462 ///
463 /// ```rust
464 /// # use nom::{Err,error::ErrorKind, IResult};
465 /// use nom::combinator::not;
466 /// use nom::character::complete::alpha1;
467 /// # fn main() {
468 ///
469 /// let mut parser = not(alpha1);
470 ///
471 /// assert_eq!(parser("123"), Ok(("123", ())));
472 /// assert_eq!(parser("abcd"), Err(Err::Error(("abcd", ErrorKind::Not))));
473 /// # }
474 /// ```
not<I: Clone, O, E: ParseError<I>, F>(mut parser: F) -> impl FnMut(I) -> IResult<I, (), E> where F: Parser<I, O, E>,475 pub fn not<I: Clone, O, E: ParseError<I>, F>(mut parser: F) -> impl FnMut(I) -> IResult<I, (), E>
476 where
477 F: Parser<I, O, E>,
478 {
479 move |input: I| {
480 let i = input.clone();
481 match parser.parse(input) {
482 Ok(_) => Err(Err::Error(E::from_error_kind(i, ErrorKind::Not))),
483 Err(Err::Error(_)) => Ok((i, ())),
484 Err(e) => Err(e),
485 }
486 }
487 }
488
489 /// If the child parser was successful, return the consumed input as produced value.
490 ///
491 /// ```rust
492 /// # use nom::{Err,error::ErrorKind, IResult};
493 /// use nom::combinator::recognize;
494 /// use nom::character::complete::{char, alpha1};
495 /// use nom::sequence::separated_pair;
496 /// # fn main() {
497 ///
498 /// let mut parser = recognize(separated_pair(alpha1, char(','), alpha1));
499 ///
500 /// assert_eq!(parser("abcd,efgh"), Ok(("", "abcd,efgh")));
501 /// assert_eq!(parser("abcd;"),Err(Err::Error((";", ErrorKind::Char))));
502 /// # }
503 /// ```
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>,504 pub fn recognize<I: Clone + Offset + Slice<RangeTo<usize>>, O, E: ParseError<I>, F>(
505 mut parser: F,
506 ) -> impl FnMut(I) -> IResult<I, I, E>
507 where
508 F: Parser<I, O, E>,
509 {
510 move |input: I| {
511 let i = input.clone();
512 match parser.parse(i) {
513 Ok((i, _)) => {
514 let index = input.offset(&i);
515 Ok((i, input.slice(..index)))
516 }
517 Err(e) => Err(e),
518 }
519 }
520 }
521
522 /// if the child parser was successful, return the consumed input with the output
523 /// as a tuple. Functions similarly to [recognize](fn.recognize.html) except it
524 /// returns the parser output as well.
525 ///
526 /// This can be useful especially in cases where the output is not the same type
527 /// as the input, or the input is a user defined type.
528 ///
529 /// Returned tuple is of the format `(consumed input, produced output)`.
530 ///
531 /// ```rust
532 /// # use nom::{Err,error::ErrorKind, IResult};
533 /// use nom::combinator::{consumed, value, recognize, map};
534 /// use nom::character::complete::{char, alpha1};
535 /// use nom::bytes::complete::tag;
536 /// use nom::sequence::separated_pair;
537 ///
538 /// fn inner_parser(input: &str) -> IResult<&str, bool> {
539 /// value(true, tag("1234"))(input)
540 /// }
541 ///
542 /// # fn main() {
543 ///
544 /// let mut consumed_parser = consumed(value(true, separated_pair(alpha1, char(','), alpha1)));
545 ///
546 /// assert_eq!(consumed_parser("abcd,efgh1"), Ok(("1", ("abcd,efgh", true))));
547 /// assert_eq!(consumed_parser("abcd;"),Err(Err::Error((";", ErrorKind::Char))));
548 ///
549 ///
550 /// // the first output (representing the consumed input)
551 /// // should be the same as that of the `recognize` parser.
552 /// let mut recognize_parser = recognize(inner_parser);
553 /// let mut consumed_parser = map(consumed(inner_parser), |(consumed, output)| consumed);
554 ///
555 /// assert_eq!(recognize_parser("1234"), consumed_parser("1234"));
556 /// assert_eq!(recognize_parser("abcd"), consumed_parser("abcd"));
557 /// # }
558 /// ```
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>,559 pub fn consumed<I, O, F, E>(mut parser: F) -> impl FnMut(I) -> IResult<I, (I, O), E>
560 where
561 I: Clone + Offset + Slice<RangeTo<usize>>,
562 E: ParseError<I>,
563 F: Parser<I, O, E>,
564 {
565 move |input: I| {
566 let i = input.clone();
567 match parser.parse(i) {
568 Ok((remaining, result)) => {
569 let index = input.offset(&remaining);
570 let consumed = input.slice(..index);
571 Ok((remaining, (consumed, result)))
572 }
573 Err(e) => Err(e),
574 }
575 }
576 }
577
578 /// transforms an error to failure
579 ///
580 /// ```rust
581 /// # use nom::{Err,error::ErrorKind, IResult};
582 /// use nom::combinator::cut;
583 /// use nom::character::complete::alpha1;
584 /// # fn main() {
585 ///
586 /// let mut parser = cut(alpha1);
587 ///
588 /// assert_eq!(parser("abcd;"), Ok((";", "abcd")));
589 /// assert_eq!(parser("123;"), Err(Err::Failure(("123;", ErrorKind::Alpha))));
590 /// # }
591 /// ```
cut<I, O, E: ParseError<I>, F>(mut parser: F) -> impl FnMut(I) -> IResult<I, O, E> where F: Parser<I, O, E>,592 pub fn cut<I, O, E: ParseError<I>, F>(mut parser: F) -> impl FnMut(I) -> IResult<I, O, E>
593 where
594 F: Parser<I, O, E>,
595 {
596 move |input: I| match parser.parse(input) {
597 Err(Err::Error(e)) => Err(Err::Failure(e)),
598 rest => rest,
599 }
600 }
601
602 /// automatically converts the child parser's result to another type
603 ///
604 /// it will be able to convert the output value and the error value
605 /// as long as the `Into` implementations are available
606 ///
607 /// ```rust
608 /// # use nom::IResult;
609 /// use nom::combinator::into;
610 /// use nom::character::complete::alpha1;
611 /// # fn main() {
612 ///
613 /// fn parser1(i: &str) -> IResult<&str, &str> {
614 /// alpha1(i)
615 /// }
616 ///
617 /// let mut parser2 = into(parser1);
618 ///
619 /// // the parser converts the &str output of the child parser into a Vec<u8>
620 /// let bytes: IResult<&str, Vec<u8>> = parser2("abcd");
621 /// assert_eq!(bytes, Ok(("", vec![97, 98, 99, 100])));
622 /// # }
623 /// ```
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>,624 pub fn into<I, O1, O2, E1, E2, F>(mut parser: F) -> impl FnMut(I) -> IResult<I, O2, E2>
625 where
626 O1: Into<O2>,
627 E1: Into<E2>,
628 E1: ParseError<I>,
629 E2: ParseError<I>,
630 F: Parser<I, O1, E1>,
631 {
632 //map(parser, Into::into)
633 move |input: I| match parser.parse(input) {
634 Ok((i, o)) => Ok((i, o.into())),
635 Err(Err::Error(e)) => Err(Err::Error(e.into())),
636 Err(Err::Failure(e)) => Err(Err::Failure(e.into())),
637 Err(Err::Incomplete(e)) => Err(Err::Incomplete(e)),
638 }
639 }
640
641 /// Creates an iterator from input data and a parser.
642 ///
643 /// Call the iterator's [ParserIterator::finish] method to get the remaining input if successful,
644 /// or the error value if we encountered an error.
645 ///
646 /// ```rust
647 /// use nom::{combinator::iterator, IResult, bytes::complete::tag, character::complete::alpha1, sequence::terminated};
648 /// use std::collections::HashMap;
649 ///
650 /// let data = "abc|defg|hijkl|mnopqr|123";
651 /// let mut it = iterator(data, terminated(alpha1, tag("|")));
652 ///
653 /// let parsed = it.map(|v| (v, v.len())).collect::<HashMap<_,_>>();
654 /// let res: IResult<_,_> = it.finish();
655 ///
656 /// assert_eq!(parsed, [("abc", 3usize), ("defg", 4), ("hijkl", 5), ("mnopqr", 6)].iter().cloned().collect());
657 /// assert_eq!(res, Ok(("123", ())));
658 /// ```
iterator<Input, Output, Error, F>(input: Input, f: F) -> ParserIterator<Input, Error, F> where F: Parser<Input, Output, Error>, Error: ParseError<Input>,659 pub fn iterator<Input, Output, Error, F>(input: Input, f: F) -> ParserIterator<Input, Error, F>
660 where
661 F: Parser<Input, Output, Error>,
662 Error: ParseError<Input>,
663 {
664 ParserIterator {
665 iterator: f,
666 input,
667 state: Some(State::Running),
668 }
669 }
670
671 /// Main structure associated to the [iterator] function.
672 pub struct ParserIterator<I, E, F> {
673 iterator: F,
674 input: I,
675 state: Option<State<E>>,
676 }
677
678 impl<I: Clone, E, F> ParserIterator<I, E, F> {
679 /// Returns the remaining input if parsing was successful, or the error if we encountered an error.
finish(mut self) -> IResult<I, (), E>680 pub fn finish(mut self) -> IResult<I, (), E> {
681 match self.state.take().unwrap() {
682 State::Running | State::Done => Ok((self.input, ())),
683 State::Failure(e) => Err(Err::Failure(e)),
684 State::Incomplete(i) => Err(Err::Incomplete(i)),
685 }
686 }
687 }
688
689 impl<'a, Input, Output, Error, F> core::iter::Iterator for &'a mut ParserIterator<Input, Error, F>
690 where
691 F: FnMut(Input) -> IResult<Input, Output, Error>,
692 Input: Clone,
693 {
694 type Item = Output;
695
next(&mut self) -> Option<Self::Item>696 fn next(&mut self) -> Option<Self::Item> {
697 if let State::Running = self.state.take().unwrap() {
698 let input = self.input.clone();
699
700 match (self.iterator)(input) {
701 Ok((i, o)) => {
702 self.input = i;
703 self.state = Some(State::Running);
704 Some(o)
705 }
706 Err(Err::Error(_)) => {
707 self.state = Some(State::Done);
708 None
709 }
710 Err(Err::Failure(e)) => {
711 self.state = Some(State::Failure(e));
712 None
713 }
714 Err(Err::Incomplete(i)) => {
715 self.state = Some(State::Incomplete(i));
716 None
717 }
718 }
719 } else {
720 None
721 }
722 }
723 }
724
725 enum State<E> {
726 Running,
727 Done,
728 Failure(E),
729 Incomplete(Needed),
730 }
731
732 /// a parser which always succeeds with given value without consuming any input.
733 ///
734 /// It can be used for example as the last alternative in `alt` to
735 /// specify the default case.
736 ///
737 /// ```rust
738 /// # use nom::{Err,error::ErrorKind, IResult};
739 /// use nom::branch::alt;
740 /// use nom::combinator::{success, value};
741 /// use nom::character::complete::char;
742 /// # fn main() {
743 ///
744 /// let mut parser = success::<_,_,(_,ErrorKind)>(10);
745 /// assert_eq!(parser("xyz"), Ok(("xyz", 10)));
746 ///
747 /// let mut sign = alt((value(-1, char('-')), value(1, char('+')), success::<_,_,(_,ErrorKind)>(1)));
748 /// assert_eq!(sign("+10"), Ok(("10", 1)));
749 /// assert_eq!(sign("-10"), Ok(("10", -1)));
750 /// assert_eq!(sign("10"), Ok(("10", 1)));
751 /// # }
752 /// ```
success<I, O: Clone, E: ParseError<I>>(val: O) -> impl Fn(I) -> IResult<I, O, E>753 pub fn success<I, O: Clone, E: ParseError<I>>(val: O) -> impl Fn(I) -> IResult<I, O, E> {
754 move |input: I| Ok((input, val.clone()))
755 }
756
757 /// A parser which always fails.
758 ///
759 /// ```rust
760 /// # use nom::{Err, error::ErrorKind, IResult};
761 /// use nom::combinator::fail;
762 ///
763 /// let s = "string";
764 /// assert_eq!(fail::<_, &str, _>(s), Err(Err::Error((s, ErrorKind::Fail))));
765 /// ```
fail<I, O, E: ParseError<I>>(i: I) -> IResult<I, O, E>766 pub fn fail<I, O, E: ParseError<I>>(i: I) -> IResult<I, O, E> {
767 Err(Err::Error(E::from_error_kind(i, ErrorKind::Fail)))
768 }
769