16855e09eSopenharmony_ci//! General purpose combinators
26855e09eSopenharmony_ci
36855e09eSopenharmony_ci#![allow(unused_imports)]
46855e09eSopenharmony_ci
56855e09eSopenharmony_ci#[cfg(feature = "alloc")]
66855e09eSopenharmony_ciuse crate::lib::std::boxed::Box;
76855e09eSopenharmony_ci
86855e09eSopenharmony_ciuse crate::error::{ErrorKind, FromExternalError, ParseError};
96855e09eSopenharmony_ciuse crate::internal::*;
106855e09eSopenharmony_ciuse crate::lib::std::borrow::Borrow;
116855e09eSopenharmony_ciuse crate::lib::std::convert::Into;
126855e09eSopenharmony_ci#[cfg(feature = "std")]
136855e09eSopenharmony_ciuse crate::lib::std::fmt::Debug;
146855e09eSopenharmony_ciuse crate::lib::std::mem::transmute;
156855e09eSopenharmony_ciuse crate::lib::std::ops::{Range, RangeFrom, RangeTo};
166855e09eSopenharmony_ciuse crate::traits::{AsChar, InputIter, InputLength, InputTakeAtPosition, ParseTo};
176855e09eSopenharmony_ciuse crate::traits::{Compare, CompareResult, Offset, Slice};
186855e09eSopenharmony_ci
196855e09eSopenharmony_ci#[cfg(test)]
206855e09eSopenharmony_cimod tests;
216855e09eSopenharmony_ci
226855e09eSopenharmony_ci/// Return the remaining input.
236855e09eSopenharmony_ci///
246855e09eSopenharmony_ci/// ```rust
256855e09eSopenharmony_ci/// # use nom::error::ErrorKind;
266855e09eSopenharmony_ci/// use nom::combinator::rest;
276855e09eSopenharmony_ci/// assert_eq!(rest::<_,(_, ErrorKind)>("abc"), Ok(("", "abc")));
286855e09eSopenharmony_ci/// assert_eq!(rest::<_,(_, ErrorKind)>(""), Ok(("", "")));
296855e09eSopenharmony_ci/// ```
306855e09eSopenharmony_ci#[inline]
316855e09eSopenharmony_cipub fn rest<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
326855e09eSopenharmony_ciwhere
336855e09eSopenharmony_ci  T: Slice<RangeFrom<usize>>,
346855e09eSopenharmony_ci  T: InputLength,
356855e09eSopenharmony_ci{
366855e09eSopenharmony_ci  Ok((input.slice(input.input_len()..), input))
376855e09eSopenharmony_ci}
386855e09eSopenharmony_ci
396855e09eSopenharmony_ci/// Return the length of the remaining input.
406855e09eSopenharmony_ci///
416855e09eSopenharmony_ci/// ```rust
426855e09eSopenharmony_ci/// # use nom::error::ErrorKind;
436855e09eSopenharmony_ci/// use nom::combinator::rest_len;
446855e09eSopenharmony_ci/// assert_eq!(rest_len::<_,(_, ErrorKind)>("abc"), Ok(("abc", 3)));
456855e09eSopenharmony_ci/// assert_eq!(rest_len::<_,(_, ErrorKind)>(""), Ok(("", 0)));
466855e09eSopenharmony_ci/// ```
476855e09eSopenharmony_ci#[inline]
486855e09eSopenharmony_cipub fn rest_len<T, E: ParseError<T>>(input: T) -> IResult<T, usize, E>
496855e09eSopenharmony_ciwhere
506855e09eSopenharmony_ci  T: InputLength,
516855e09eSopenharmony_ci{
526855e09eSopenharmony_ci  let len = input.input_len();
536855e09eSopenharmony_ci  Ok((input, len))
546855e09eSopenharmony_ci}
556855e09eSopenharmony_ci
566855e09eSopenharmony_ci/// Maps a function on the result of a parser.
576855e09eSopenharmony_ci///
586855e09eSopenharmony_ci/// ```rust
596855e09eSopenharmony_ci/// use nom::{Err,error::ErrorKind, IResult,Parser};
606855e09eSopenharmony_ci/// use nom::character::complete::digit1;
616855e09eSopenharmony_ci/// use nom::combinator::map;
626855e09eSopenharmony_ci/// # fn main() {
636855e09eSopenharmony_ci///
646855e09eSopenharmony_ci/// let mut parser = map(digit1, |s: &str| s.len());
656855e09eSopenharmony_ci///
666855e09eSopenharmony_ci/// // the parser will count how many characters were returned by digit1
676855e09eSopenharmony_ci/// assert_eq!(parser.parse("123456"), Ok(("", 6)));
686855e09eSopenharmony_ci///
696855e09eSopenharmony_ci/// // this will fail if digit1 fails
706855e09eSopenharmony_ci/// assert_eq!(parser.parse("abc"), Err(Err::Error(("abc", ErrorKind::Digit))));
716855e09eSopenharmony_ci/// # }
726855e09eSopenharmony_ci/// ```
736855e09eSopenharmony_cipub fn map<I, O1, O2, E, F, G>(mut parser: F, mut f: G) -> impl FnMut(I) -> IResult<I, O2, E>
746855e09eSopenharmony_ciwhere
756855e09eSopenharmony_ci  F: Parser<I, O1, E>,
766855e09eSopenharmony_ci  G: FnMut(O1) -> O2,
776855e09eSopenharmony_ci{
786855e09eSopenharmony_ci  move |input: I| {
796855e09eSopenharmony_ci    let (input, o1) = parser.parse(input)?;
806855e09eSopenharmony_ci    Ok((input, f(o1)))
816855e09eSopenharmony_ci  }
826855e09eSopenharmony_ci}
836855e09eSopenharmony_ci
846855e09eSopenharmony_ci/// Applies a function returning a `Result` over the result of a parser.
856855e09eSopenharmony_ci///
866855e09eSopenharmony_ci/// ```rust
876855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
886855e09eSopenharmony_ci/// use nom::character::complete::digit1;
896855e09eSopenharmony_ci/// use nom::combinator::map_res;
906855e09eSopenharmony_ci/// # fn main() {
916855e09eSopenharmony_ci///
926855e09eSopenharmony_ci/// let mut parse = map_res(digit1, |s: &str| s.parse::<u8>());
936855e09eSopenharmony_ci///
946855e09eSopenharmony_ci/// // the parser will convert the result of digit1 to a number
956855e09eSopenharmony_ci/// assert_eq!(parse("123"), Ok(("", 123)));
966855e09eSopenharmony_ci///
976855e09eSopenharmony_ci/// // this will fail if digit1 fails
986855e09eSopenharmony_ci/// assert_eq!(parse("abc"), Err(Err::Error(("abc", ErrorKind::Digit))));
996855e09eSopenharmony_ci///
1006855e09eSopenharmony_ci/// // this will fail if the mapped function fails (a `u8` is too small to hold `123456`)
1016855e09eSopenharmony_ci/// assert_eq!(parse("123456"), Err(Err::Error(("123456", ErrorKind::MapRes))));
1026855e09eSopenharmony_ci/// # }
1036855e09eSopenharmony_ci/// ```
1046855e09eSopenharmony_cipub fn map_res<I: Clone, O1, O2, E: FromExternalError<I, E2>, E2, F, G>(
1056855e09eSopenharmony_ci  mut parser: F,
1066855e09eSopenharmony_ci  mut f: G,
1076855e09eSopenharmony_ci) -> impl FnMut(I) -> IResult<I, O2, E>
1086855e09eSopenharmony_ciwhere
1096855e09eSopenharmony_ci  F: Parser<I, O1, E>,
1106855e09eSopenharmony_ci  G: FnMut(O1) -> Result<O2, E2>,
1116855e09eSopenharmony_ci{
1126855e09eSopenharmony_ci  move |input: I| {
1136855e09eSopenharmony_ci    let i = input.clone();
1146855e09eSopenharmony_ci    let (input, o1) = parser.parse(input)?;
1156855e09eSopenharmony_ci    match f(o1) {
1166855e09eSopenharmony_ci      Ok(o2) => Ok((input, o2)),
1176855e09eSopenharmony_ci      Err(e) => Err(Err::Error(E::from_external_error(i, ErrorKind::MapRes, e))),
1186855e09eSopenharmony_ci    }
1196855e09eSopenharmony_ci  }
1206855e09eSopenharmony_ci}
1216855e09eSopenharmony_ci
1226855e09eSopenharmony_ci/// Applies a function returning an `Option` over the result of a parser.
1236855e09eSopenharmony_ci///
1246855e09eSopenharmony_ci/// ```rust
1256855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
1266855e09eSopenharmony_ci/// use nom::character::complete::digit1;
1276855e09eSopenharmony_ci/// use nom::combinator::map_opt;
1286855e09eSopenharmony_ci/// # fn main() {
1296855e09eSopenharmony_ci///
1306855e09eSopenharmony_ci/// let mut parse = map_opt(digit1, |s: &str| s.parse::<u8>().ok());
1316855e09eSopenharmony_ci///
1326855e09eSopenharmony_ci/// // the parser will convert the result of digit1 to a number
1336855e09eSopenharmony_ci/// assert_eq!(parse("123"), Ok(("", 123)));
1346855e09eSopenharmony_ci///
1356855e09eSopenharmony_ci/// // this will fail if digit1 fails
1366855e09eSopenharmony_ci/// assert_eq!(parse("abc"), Err(Err::Error(("abc", ErrorKind::Digit))));
1376855e09eSopenharmony_ci///
1386855e09eSopenharmony_ci/// // this will fail if the mapped function fails (a `u8` is too small to hold `123456`)
1396855e09eSopenharmony_ci/// assert_eq!(parse("123456"), Err(Err::Error(("123456", ErrorKind::MapOpt))));
1406855e09eSopenharmony_ci/// # }
1416855e09eSopenharmony_ci/// ```
1426855e09eSopenharmony_cipub fn map_opt<I: Clone, O1, O2, E: ParseError<I>, F, G>(
1436855e09eSopenharmony_ci  mut parser: F,
1446855e09eSopenharmony_ci  mut f: G,
1456855e09eSopenharmony_ci) -> impl FnMut(I) -> IResult<I, O2, E>
1466855e09eSopenharmony_ciwhere
1476855e09eSopenharmony_ci  F: Parser<I, O1, E>,
1486855e09eSopenharmony_ci  G: FnMut(O1) -> Option<O2>,
1496855e09eSopenharmony_ci{
1506855e09eSopenharmony_ci  move |input: I| {
1516855e09eSopenharmony_ci    let i = input.clone();
1526855e09eSopenharmony_ci    let (input, o1) = parser.parse(input)?;
1536855e09eSopenharmony_ci    match f(o1) {
1546855e09eSopenharmony_ci      Some(o2) => Ok((input, o2)),
1556855e09eSopenharmony_ci      None => Err(Err::Error(E::from_error_kind(i, ErrorKind::MapOpt))),
1566855e09eSopenharmony_ci    }
1576855e09eSopenharmony_ci  }
1586855e09eSopenharmony_ci}
1596855e09eSopenharmony_ci
1606855e09eSopenharmony_ci/// Applies a parser over the result of another one.
1616855e09eSopenharmony_ci///
1626855e09eSopenharmony_ci/// ```rust
1636855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
1646855e09eSopenharmony_ci/// use nom::character::complete::digit1;
1656855e09eSopenharmony_ci/// use nom::bytes::complete::take;
1666855e09eSopenharmony_ci/// use nom::combinator::map_parser;
1676855e09eSopenharmony_ci/// # fn main() {
1686855e09eSopenharmony_ci///
1696855e09eSopenharmony_ci/// let mut parse = map_parser(take(5u8), digit1);
1706855e09eSopenharmony_ci///
1716855e09eSopenharmony_ci/// assert_eq!(parse("12345"), Ok(("", "12345")));
1726855e09eSopenharmony_ci/// assert_eq!(parse("123ab"), Ok(("", "123")));
1736855e09eSopenharmony_ci/// assert_eq!(parse("123"), Err(Err::Error(("123", ErrorKind::Eof))));
1746855e09eSopenharmony_ci/// # }
1756855e09eSopenharmony_ci/// ```
1766855e09eSopenharmony_cipub fn map_parser<I, O1, O2, E: ParseError<I>, F, G>(
1776855e09eSopenharmony_ci  mut parser: F,
1786855e09eSopenharmony_ci  mut applied_parser: G,
1796855e09eSopenharmony_ci) -> impl FnMut(I) -> IResult<I, O2, E>
1806855e09eSopenharmony_ciwhere
1816855e09eSopenharmony_ci  F: Parser<I, O1, E>,
1826855e09eSopenharmony_ci  G: Parser<O1, O2, E>,
1836855e09eSopenharmony_ci{
1846855e09eSopenharmony_ci  move |input: I| {
1856855e09eSopenharmony_ci    let (input, o1) = parser.parse(input)?;
1866855e09eSopenharmony_ci    let (_, o2) = applied_parser.parse(o1)?;
1876855e09eSopenharmony_ci    Ok((input, o2))
1886855e09eSopenharmony_ci  }
1896855e09eSopenharmony_ci}
1906855e09eSopenharmony_ci
1916855e09eSopenharmony_ci/// Creates a new parser from the output of the first parser, then apply that parser over the rest of the input.
1926855e09eSopenharmony_ci///
1936855e09eSopenharmony_ci/// ```rust
1946855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
1956855e09eSopenharmony_ci/// use nom::bytes::complete::take;
1966855e09eSopenharmony_ci/// use nom::number::complete::u8;
1976855e09eSopenharmony_ci/// use nom::combinator::flat_map;
1986855e09eSopenharmony_ci/// # fn main() {
1996855e09eSopenharmony_ci///
2006855e09eSopenharmony_ci/// let mut parse = flat_map(u8, take);
2016855e09eSopenharmony_ci///
2026855e09eSopenharmony_ci/// assert_eq!(parse(&[2, 0, 1, 2][..]), Ok((&[2][..], &[0, 1][..])));
2036855e09eSopenharmony_ci/// assert_eq!(parse(&[4, 0, 1, 2][..]), Err(Err::Error((&[0, 1, 2][..], ErrorKind::Eof))));
2046855e09eSopenharmony_ci/// # }
2056855e09eSopenharmony_ci/// ```
2066855e09eSopenharmony_cipub fn flat_map<I, O1, O2, E: ParseError<I>, F, G, H>(
2076855e09eSopenharmony_ci  mut parser: F,
2086855e09eSopenharmony_ci  mut applied_parser: G,
2096855e09eSopenharmony_ci) -> impl FnMut(I) -> IResult<I, O2, E>
2106855e09eSopenharmony_ciwhere
2116855e09eSopenharmony_ci  F: Parser<I, O1, E>,
2126855e09eSopenharmony_ci  G: FnMut(O1) -> H,
2136855e09eSopenharmony_ci  H: Parser<I, O2, E>,
2146855e09eSopenharmony_ci{
2156855e09eSopenharmony_ci  move |input: I| {
2166855e09eSopenharmony_ci    let (input, o1) = parser.parse(input)?;
2176855e09eSopenharmony_ci    applied_parser(o1).parse(input)
2186855e09eSopenharmony_ci  }
2196855e09eSopenharmony_ci}
2206855e09eSopenharmony_ci
2216855e09eSopenharmony_ci/// Optional parser, will return `None` on [`Err::Error`].
2226855e09eSopenharmony_ci///
2236855e09eSopenharmony_ci/// To chain an error up, see [`cut`].
2246855e09eSopenharmony_ci///
2256855e09eSopenharmony_ci/// ```rust
2266855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
2276855e09eSopenharmony_ci/// use nom::combinator::opt;
2286855e09eSopenharmony_ci/// use nom::character::complete::alpha1;
2296855e09eSopenharmony_ci/// # fn main() {
2306855e09eSopenharmony_ci///
2316855e09eSopenharmony_ci/// fn parser(i: &str) -> IResult<&str, Option<&str>> {
2326855e09eSopenharmony_ci///   opt(alpha1)(i)
2336855e09eSopenharmony_ci/// }
2346855e09eSopenharmony_ci///
2356855e09eSopenharmony_ci/// assert_eq!(parser("abcd;"), Ok((";", Some("abcd"))));
2366855e09eSopenharmony_ci/// assert_eq!(parser("123;"), Ok(("123;", None)));
2376855e09eSopenharmony_ci/// # }
2386855e09eSopenharmony_ci/// ```
2396855e09eSopenharmony_cipub fn opt<I: Clone, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, Option<O>, E>
2406855e09eSopenharmony_ciwhere
2416855e09eSopenharmony_ci  F: Parser<I, O, E>,
2426855e09eSopenharmony_ci{
2436855e09eSopenharmony_ci  move |input: I| {
2446855e09eSopenharmony_ci    let i = input.clone();
2456855e09eSopenharmony_ci    match f.parse(input) {
2466855e09eSopenharmony_ci      Ok((i, o)) => Ok((i, Some(o))),
2476855e09eSopenharmony_ci      Err(Err::Error(_)) => Ok((i, None)),
2486855e09eSopenharmony_ci      Err(e) => Err(e),
2496855e09eSopenharmony_ci    }
2506855e09eSopenharmony_ci  }
2516855e09eSopenharmony_ci}
2526855e09eSopenharmony_ci
2536855e09eSopenharmony_ci/// Calls the parser if the condition is met.
2546855e09eSopenharmony_ci///
2556855e09eSopenharmony_ci/// ```rust
2566855e09eSopenharmony_ci/// # use nom::{Err, error::{Error, ErrorKind}, IResult};
2576855e09eSopenharmony_ci/// use nom::combinator::cond;
2586855e09eSopenharmony_ci/// use nom::character::complete::alpha1;
2596855e09eSopenharmony_ci/// # fn main() {
2606855e09eSopenharmony_ci///
2616855e09eSopenharmony_ci/// fn parser(b: bool, i: &str) -> IResult<&str, Option<&str>> {
2626855e09eSopenharmony_ci///   cond(b, alpha1)(i)
2636855e09eSopenharmony_ci/// }
2646855e09eSopenharmony_ci///
2656855e09eSopenharmony_ci/// assert_eq!(parser(true, "abcd;"), Ok((";", Some("abcd"))));
2666855e09eSopenharmony_ci/// assert_eq!(parser(false, "abcd;"), Ok(("abcd;", None)));
2676855e09eSopenharmony_ci/// assert_eq!(parser(true, "123;"), Err(Err::Error(Error::new("123;", ErrorKind::Alpha))));
2686855e09eSopenharmony_ci/// assert_eq!(parser(false, "123;"), Ok(("123;", None)));
2696855e09eSopenharmony_ci/// # }
2706855e09eSopenharmony_ci/// ```
2716855e09eSopenharmony_cipub fn cond<I, O, E: ParseError<I>, F>(
2726855e09eSopenharmony_ci  b: bool,
2736855e09eSopenharmony_ci  mut f: F,
2746855e09eSopenharmony_ci) -> impl FnMut(I) -> IResult<I, Option<O>, E>
2756855e09eSopenharmony_ciwhere
2766855e09eSopenharmony_ci  F: Parser<I, O, E>,
2776855e09eSopenharmony_ci{
2786855e09eSopenharmony_ci  move |input: I| {
2796855e09eSopenharmony_ci    if b {
2806855e09eSopenharmony_ci      match f.parse(input) {
2816855e09eSopenharmony_ci        Ok((i, o)) => Ok((i, Some(o))),
2826855e09eSopenharmony_ci        Err(e) => Err(e),
2836855e09eSopenharmony_ci      }
2846855e09eSopenharmony_ci    } else {
2856855e09eSopenharmony_ci      Ok((input, None))
2866855e09eSopenharmony_ci    }
2876855e09eSopenharmony_ci  }
2886855e09eSopenharmony_ci}
2896855e09eSopenharmony_ci
2906855e09eSopenharmony_ci/// Tries to apply its parser without consuming the input.
2916855e09eSopenharmony_ci///
2926855e09eSopenharmony_ci/// ```rust
2936855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
2946855e09eSopenharmony_ci/// use nom::combinator::peek;
2956855e09eSopenharmony_ci/// use nom::character::complete::alpha1;
2966855e09eSopenharmony_ci/// # fn main() {
2976855e09eSopenharmony_ci///
2986855e09eSopenharmony_ci/// let mut parser = peek(alpha1);
2996855e09eSopenharmony_ci///
3006855e09eSopenharmony_ci/// assert_eq!(parser("abcd;"), Ok(("abcd;", "abcd")));
3016855e09eSopenharmony_ci/// assert_eq!(parser("123;"), Err(Err::Error(("123;", ErrorKind::Alpha))));
3026855e09eSopenharmony_ci/// # }
3036855e09eSopenharmony_ci/// ```
3046855e09eSopenharmony_cipub fn peek<I: Clone, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, O, E>
3056855e09eSopenharmony_ciwhere
3066855e09eSopenharmony_ci  F: Parser<I, O, E>,
3076855e09eSopenharmony_ci{
3086855e09eSopenharmony_ci  move |input: I| {
3096855e09eSopenharmony_ci    let i = input.clone();
3106855e09eSopenharmony_ci    match f.parse(input) {
3116855e09eSopenharmony_ci      Ok((_, o)) => Ok((i, o)),
3126855e09eSopenharmony_ci      Err(e) => Err(e),
3136855e09eSopenharmony_ci    }
3146855e09eSopenharmony_ci  }
3156855e09eSopenharmony_ci}
3166855e09eSopenharmony_ci
3176855e09eSopenharmony_ci/// returns its input if it is at the end of input data
3186855e09eSopenharmony_ci///
3196855e09eSopenharmony_ci/// When we're at the end of the data, this combinator
3206855e09eSopenharmony_ci/// will succeed
3216855e09eSopenharmony_ci///
3226855e09eSopenharmony_ci/// ```
3236855e09eSopenharmony_ci/// # use std::str;
3246855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, IResult};
3256855e09eSopenharmony_ci/// # use nom::combinator::eof;
3266855e09eSopenharmony_ci///
3276855e09eSopenharmony_ci/// # fn main() {
3286855e09eSopenharmony_ci/// let parser = eof;
3296855e09eSopenharmony_ci/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Eof))));
3306855e09eSopenharmony_ci/// assert_eq!(parser(""), Ok(("", "")));
3316855e09eSopenharmony_ci/// # }
3326855e09eSopenharmony_ci/// ```
3336855e09eSopenharmony_cipub fn eof<I: InputLength + Clone, E: ParseError<I>>(input: I) -> IResult<I, I, E> {
3346855e09eSopenharmony_ci  if input.input_len() == 0 {
3356855e09eSopenharmony_ci    let clone = input.clone();
3366855e09eSopenharmony_ci    Ok((input, clone))
3376855e09eSopenharmony_ci  } else {
3386855e09eSopenharmony_ci    Err(Err::Error(E::from_error_kind(input, ErrorKind::Eof)))
3396855e09eSopenharmony_ci  }
3406855e09eSopenharmony_ci}
3416855e09eSopenharmony_ci
3426855e09eSopenharmony_ci/// Transforms Incomplete into `Error`.
3436855e09eSopenharmony_ci///
3446855e09eSopenharmony_ci/// ```rust
3456855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
3466855e09eSopenharmony_ci/// use nom::bytes::streaming::take;
3476855e09eSopenharmony_ci/// use nom::combinator::complete;
3486855e09eSopenharmony_ci/// # fn main() {
3496855e09eSopenharmony_ci///
3506855e09eSopenharmony_ci/// let mut parser = complete(take(5u8));
3516855e09eSopenharmony_ci///
3526855e09eSopenharmony_ci/// assert_eq!(parser("abcdefg"), Ok(("fg", "abcde")));
3536855e09eSopenharmony_ci/// assert_eq!(parser("abcd"), Err(Err::Error(("abcd", ErrorKind::Complete))));
3546855e09eSopenharmony_ci/// # }
3556855e09eSopenharmony_ci/// ```
3566855e09eSopenharmony_cipub fn complete<I: Clone, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, O, E>
3576855e09eSopenharmony_ciwhere
3586855e09eSopenharmony_ci  F: Parser<I, O, E>,
3596855e09eSopenharmony_ci{
3606855e09eSopenharmony_ci  move |input: I| {
3616855e09eSopenharmony_ci    let i = input.clone();
3626855e09eSopenharmony_ci    match f.parse(input) {
3636855e09eSopenharmony_ci      Err(Err::Incomplete(_)) => Err(Err::Error(E::from_error_kind(i, ErrorKind::Complete))),
3646855e09eSopenharmony_ci      rest => rest,
3656855e09eSopenharmony_ci    }
3666855e09eSopenharmony_ci  }
3676855e09eSopenharmony_ci}
3686855e09eSopenharmony_ci
3696855e09eSopenharmony_ci/// Succeeds if all the input has been consumed by its child parser.
3706855e09eSopenharmony_ci///
3716855e09eSopenharmony_ci/// ```rust
3726855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
3736855e09eSopenharmony_ci/// use nom::combinator::all_consuming;
3746855e09eSopenharmony_ci/// use nom::character::complete::alpha1;
3756855e09eSopenharmony_ci/// # fn main() {
3766855e09eSopenharmony_ci///
3776855e09eSopenharmony_ci/// let mut parser = all_consuming(alpha1);
3786855e09eSopenharmony_ci///
3796855e09eSopenharmony_ci/// assert_eq!(parser("abcd"), Ok(("", "abcd")));
3806855e09eSopenharmony_ci/// assert_eq!(parser("abcd;"),Err(Err::Error((";", ErrorKind::Eof))));
3816855e09eSopenharmony_ci/// assert_eq!(parser("123abcd;"),Err(Err::Error(("123abcd;", ErrorKind::Alpha))));
3826855e09eSopenharmony_ci/// # }
3836855e09eSopenharmony_ci/// ```
3846855e09eSopenharmony_cipub fn all_consuming<I, O, E: ParseError<I>, F>(mut f: F) -> impl FnMut(I) -> IResult<I, O, E>
3856855e09eSopenharmony_ciwhere
3866855e09eSopenharmony_ci  I: InputLength,
3876855e09eSopenharmony_ci  F: Parser<I, O, E>,
3886855e09eSopenharmony_ci{
3896855e09eSopenharmony_ci  move |input: I| {
3906855e09eSopenharmony_ci    let (input, res) = f.parse(input)?;
3916855e09eSopenharmony_ci    if input.input_len() == 0 {
3926855e09eSopenharmony_ci      Ok((input, res))
3936855e09eSopenharmony_ci    } else {
3946855e09eSopenharmony_ci      Err(Err::Error(E::from_error_kind(input, ErrorKind::Eof)))
3956855e09eSopenharmony_ci    }
3966855e09eSopenharmony_ci  }
3976855e09eSopenharmony_ci}
3986855e09eSopenharmony_ci
3996855e09eSopenharmony_ci/// Returns the result of the child parser if it satisfies a verification function.
4006855e09eSopenharmony_ci///
4016855e09eSopenharmony_ci/// The verification function takes as argument a reference to the output of the
4026855e09eSopenharmony_ci/// parser.
4036855e09eSopenharmony_ci///
4046855e09eSopenharmony_ci/// ```rust
4056855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
4066855e09eSopenharmony_ci/// use nom::combinator::verify;
4076855e09eSopenharmony_ci/// use nom::character::complete::alpha1;
4086855e09eSopenharmony_ci/// # fn main() {
4096855e09eSopenharmony_ci///
4106855e09eSopenharmony_ci/// let mut parser = verify(alpha1, |s: &str| s.len() == 4);
4116855e09eSopenharmony_ci///
4126855e09eSopenharmony_ci/// assert_eq!(parser("abcd"), Ok(("", "abcd")));
4136855e09eSopenharmony_ci/// assert_eq!(parser("abcde"), Err(Err::Error(("abcde", ErrorKind::Verify))));
4146855e09eSopenharmony_ci/// assert_eq!(parser("123abcd;"),Err(Err::Error(("123abcd;", ErrorKind::Alpha))));
4156855e09eSopenharmony_ci/// # }
4166855e09eSopenharmony_ci/// ```
4176855e09eSopenharmony_cipub fn verify<I: Clone, O1, O2, E: ParseError<I>, F, G>(
4186855e09eSopenharmony_ci  mut first: F,
4196855e09eSopenharmony_ci  second: G,
4206855e09eSopenharmony_ci) -> impl FnMut(I) -> IResult<I, O1, E>
4216855e09eSopenharmony_ciwhere
4226855e09eSopenharmony_ci  F: Parser<I, O1, E>,
4236855e09eSopenharmony_ci  G: Fn(&O2) -> bool,
4246855e09eSopenharmony_ci  O1: Borrow<O2>,
4256855e09eSopenharmony_ci  O2: ?Sized,
4266855e09eSopenharmony_ci{
4276855e09eSopenharmony_ci  move |input: I| {
4286855e09eSopenharmony_ci    let i = input.clone();
4296855e09eSopenharmony_ci    let (input, o) = first.parse(input)?;
4306855e09eSopenharmony_ci
4316855e09eSopenharmony_ci    if second(o.borrow()) {
4326855e09eSopenharmony_ci      Ok((input, o))
4336855e09eSopenharmony_ci    } else {
4346855e09eSopenharmony_ci      Err(Err::Error(E::from_error_kind(i, ErrorKind::Verify)))
4356855e09eSopenharmony_ci    }
4366855e09eSopenharmony_ci  }
4376855e09eSopenharmony_ci}
4386855e09eSopenharmony_ci
4396855e09eSopenharmony_ci/// Returns the provided value if the child parser succeeds.
4406855e09eSopenharmony_ci///
4416855e09eSopenharmony_ci/// ```rust
4426855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
4436855e09eSopenharmony_ci/// use nom::combinator::value;
4446855e09eSopenharmony_ci/// use nom::character::complete::alpha1;
4456855e09eSopenharmony_ci/// # fn main() {
4466855e09eSopenharmony_ci///
4476855e09eSopenharmony_ci/// let mut parser = value(1234, alpha1);
4486855e09eSopenharmony_ci///
4496855e09eSopenharmony_ci/// assert_eq!(parser("abcd"), Ok(("", 1234)));
4506855e09eSopenharmony_ci/// assert_eq!(parser("123abcd;"), Err(Err::Error(("123abcd;", ErrorKind::Alpha))));
4516855e09eSopenharmony_ci/// # }
4526855e09eSopenharmony_ci/// ```
4536855e09eSopenharmony_cipub fn value<I, O1: Clone, O2, E: ParseError<I>, F>(
4546855e09eSopenharmony_ci  val: O1,
4556855e09eSopenharmony_ci  mut parser: F,
4566855e09eSopenharmony_ci) -> impl FnMut(I) -> IResult<I, O1, E>
4576855e09eSopenharmony_ciwhere
4586855e09eSopenharmony_ci  F: Parser<I, O2, E>,
4596855e09eSopenharmony_ci{
4606855e09eSopenharmony_ci  move |input: I| parser.parse(input).map(|(i, _)| (i, val.clone()))
4616855e09eSopenharmony_ci}
4626855e09eSopenharmony_ci
4636855e09eSopenharmony_ci/// Succeeds if the child parser returns an error.
4646855e09eSopenharmony_ci///
4656855e09eSopenharmony_ci/// ```rust
4666855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
4676855e09eSopenharmony_ci/// use nom::combinator::not;
4686855e09eSopenharmony_ci/// use nom::character::complete::alpha1;
4696855e09eSopenharmony_ci/// # fn main() {
4706855e09eSopenharmony_ci///
4716855e09eSopenharmony_ci/// let mut parser = not(alpha1);
4726855e09eSopenharmony_ci///
4736855e09eSopenharmony_ci/// assert_eq!(parser("123"), Ok(("123", ())));
4746855e09eSopenharmony_ci/// assert_eq!(parser("abcd"), Err(Err::Error(("abcd", ErrorKind::Not))));
4756855e09eSopenharmony_ci/// # }
4766855e09eSopenharmony_ci/// ```
4776855e09eSopenharmony_cipub fn not<I: Clone, O, E: ParseError<I>, F>(mut parser: F) -> impl FnMut(I) -> IResult<I, (), E>
4786855e09eSopenharmony_ciwhere
4796855e09eSopenharmony_ci  F: Parser<I, O, E>,
4806855e09eSopenharmony_ci{
4816855e09eSopenharmony_ci  move |input: I| {
4826855e09eSopenharmony_ci    let i = input.clone();
4836855e09eSopenharmony_ci    match parser.parse(input) {
4846855e09eSopenharmony_ci      Ok(_) => Err(Err::Error(E::from_error_kind(i, ErrorKind::Not))),
4856855e09eSopenharmony_ci      Err(Err::Error(_)) => Ok((i, ())),
4866855e09eSopenharmony_ci      Err(e) => Err(e),
4876855e09eSopenharmony_ci    }
4886855e09eSopenharmony_ci  }
4896855e09eSopenharmony_ci}
4906855e09eSopenharmony_ci
4916855e09eSopenharmony_ci/// If the child parser was successful, return the consumed input as produced value.
4926855e09eSopenharmony_ci///
4936855e09eSopenharmony_ci/// ```rust
4946855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
4956855e09eSopenharmony_ci/// use nom::combinator::recognize;
4966855e09eSopenharmony_ci/// use nom::character::complete::{char, alpha1};
4976855e09eSopenharmony_ci/// use nom::sequence::separated_pair;
4986855e09eSopenharmony_ci/// # fn main() {
4996855e09eSopenharmony_ci///
5006855e09eSopenharmony_ci/// let mut parser = recognize(separated_pair(alpha1, char(','), alpha1));
5016855e09eSopenharmony_ci///
5026855e09eSopenharmony_ci/// assert_eq!(parser("abcd,efgh"), Ok(("", "abcd,efgh")));
5036855e09eSopenharmony_ci/// assert_eq!(parser("abcd;"),Err(Err::Error((";", ErrorKind::Char))));
5046855e09eSopenharmony_ci/// # }
5056855e09eSopenharmony_ci/// ```
5066855e09eSopenharmony_cipub fn recognize<I: Clone + Offset + Slice<RangeTo<usize>>, O, E: ParseError<I>, F>(
5076855e09eSopenharmony_ci  mut parser: F,
5086855e09eSopenharmony_ci) -> impl FnMut(I) -> IResult<I, I, E>
5096855e09eSopenharmony_ciwhere
5106855e09eSopenharmony_ci  F: Parser<I, O, E>,
5116855e09eSopenharmony_ci{
5126855e09eSopenharmony_ci  move |input: I| {
5136855e09eSopenharmony_ci    let i = input.clone();
5146855e09eSopenharmony_ci    match parser.parse(i) {
5156855e09eSopenharmony_ci      Ok((i, _)) => {
5166855e09eSopenharmony_ci        let index = input.offset(&i);
5176855e09eSopenharmony_ci        Ok((i, input.slice(..index)))
5186855e09eSopenharmony_ci      }
5196855e09eSopenharmony_ci      Err(e) => Err(e),
5206855e09eSopenharmony_ci    }
5216855e09eSopenharmony_ci  }
5226855e09eSopenharmony_ci}
5236855e09eSopenharmony_ci
5246855e09eSopenharmony_ci/// if the child parser was successful, return the consumed input with the output
5256855e09eSopenharmony_ci/// as a tuple. Functions similarly to [recognize](fn.recognize.html) except it
5266855e09eSopenharmony_ci/// returns the parser output as well.
5276855e09eSopenharmony_ci///
5286855e09eSopenharmony_ci/// This can be useful especially in cases where the output is not the same type
5296855e09eSopenharmony_ci/// as the input, or the input is a user defined type.
5306855e09eSopenharmony_ci///
5316855e09eSopenharmony_ci/// Returned tuple is of the format `(consumed input, produced output)`.
5326855e09eSopenharmony_ci///
5336855e09eSopenharmony_ci/// ```rust
5346855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
5356855e09eSopenharmony_ci/// use nom::combinator::{consumed, value, recognize, map};
5366855e09eSopenharmony_ci/// use nom::character::complete::{char, alpha1};
5376855e09eSopenharmony_ci/// use nom::bytes::complete::tag;
5386855e09eSopenharmony_ci/// use nom::sequence::separated_pair;
5396855e09eSopenharmony_ci///
5406855e09eSopenharmony_ci/// fn inner_parser(input: &str) -> IResult<&str, bool> {
5416855e09eSopenharmony_ci///     value(true, tag("1234"))(input)
5426855e09eSopenharmony_ci/// }
5436855e09eSopenharmony_ci///
5446855e09eSopenharmony_ci/// # fn main() {
5456855e09eSopenharmony_ci///
5466855e09eSopenharmony_ci/// let mut consumed_parser = consumed(value(true, separated_pair(alpha1, char(','), alpha1)));
5476855e09eSopenharmony_ci///
5486855e09eSopenharmony_ci/// assert_eq!(consumed_parser("abcd,efgh1"), Ok(("1", ("abcd,efgh", true))));
5496855e09eSopenharmony_ci/// assert_eq!(consumed_parser("abcd;"),Err(Err::Error((";", ErrorKind::Char))));
5506855e09eSopenharmony_ci///
5516855e09eSopenharmony_ci///
5526855e09eSopenharmony_ci/// // the first output (representing the consumed input)
5536855e09eSopenharmony_ci/// // should be the same as that of the `recognize` parser.
5546855e09eSopenharmony_ci/// let mut recognize_parser = recognize(inner_parser);
5556855e09eSopenharmony_ci/// let mut consumed_parser = map(consumed(inner_parser), |(consumed, output)| consumed);
5566855e09eSopenharmony_ci///
5576855e09eSopenharmony_ci/// assert_eq!(recognize_parser("1234"), consumed_parser("1234"));
5586855e09eSopenharmony_ci/// assert_eq!(recognize_parser("abcd"), consumed_parser("abcd"));
5596855e09eSopenharmony_ci/// # }
5606855e09eSopenharmony_ci/// ```
5616855e09eSopenharmony_cipub fn consumed<I, O, F, E>(mut parser: F) -> impl FnMut(I) -> IResult<I, (I, O), E>
5626855e09eSopenharmony_ciwhere
5636855e09eSopenharmony_ci  I: Clone + Offset + Slice<RangeTo<usize>>,
5646855e09eSopenharmony_ci  E: ParseError<I>,
5656855e09eSopenharmony_ci  F: Parser<I, O, E>,
5666855e09eSopenharmony_ci{
5676855e09eSopenharmony_ci  move |input: I| {
5686855e09eSopenharmony_ci    let i = input.clone();
5696855e09eSopenharmony_ci    match parser.parse(i) {
5706855e09eSopenharmony_ci      Ok((remaining, result)) => {
5716855e09eSopenharmony_ci        let index = input.offset(&remaining);
5726855e09eSopenharmony_ci        let consumed = input.slice(..index);
5736855e09eSopenharmony_ci        Ok((remaining, (consumed, result)))
5746855e09eSopenharmony_ci      }
5756855e09eSopenharmony_ci      Err(e) => Err(e),
5766855e09eSopenharmony_ci    }
5776855e09eSopenharmony_ci  }
5786855e09eSopenharmony_ci}
5796855e09eSopenharmony_ci
5806855e09eSopenharmony_ci/// Transforms an [`Err::Error`] (recoverable) to [`Err::Failure`] (unrecoverable)
5816855e09eSopenharmony_ci///
5826855e09eSopenharmony_ci/// This commits the parse result, preventing alternative branch paths like with
5836855e09eSopenharmony_ci/// [`nom::branch::alt`][crate::branch::alt].
5846855e09eSopenharmony_ci///
5856855e09eSopenharmony_ci/// # Example
5866855e09eSopenharmony_ci///
5876855e09eSopenharmony_ci/// Without `cut`:
5886855e09eSopenharmony_ci/// ```rust
5896855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
5906855e09eSopenharmony_ci/// # use nom::character::complete::{one_of, digit1};
5916855e09eSopenharmony_ci/// # use nom::combinator::rest;
5926855e09eSopenharmony_ci/// # use nom::branch::alt;
5936855e09eSopenharmony_ci/// # use nom::sequence::preceded;
5946855e09eSopenharmony_ci/// # fn main() {
5956855e09eSopenharmony_ci///
5966855e09eSopenharmony_ci/// fn parser(input: &str) -> IResult<&str, &str> {
5976855e09eSopenharmony_ci///   alt((
5986855e09eSopenharmony_ci///     preceded(one_of("+-"), digit1),
5996855e09eSopenharmony_ci///     rest
6006855e09eSopenharmony_ci///   ))(input)
6016855e09eSopenharmony_ci/// }
6026855e09eSopenharmony_ci///
6036855e09eSopenharmony_ci/// assert_eq!(parser("+10 ab"), Ok((" ab", "10")));
6046855e09eSopenharmony_ci/// assert_eq!(parser("ab"), Ok(("", "ab")));
6056855e09eSopenharmony_ci/// assert_eq!(parser("+"), Ok(("", "+")));
6066855e09eSopenharmony_ci/// # }
6076855e09eSopenharmony_ci/// ```
6086855e09eSopenharmony_ci///
6096855e09eSopenharmony_ci/// With `cut`:
6106855e09eSopenharmony_ci/// ```rust
6116855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult, error::Error};
6126855e09eSopenharmony_ci/// # use nom::character::complete::{one_of, digit1};
6136855e09eSopenharmony_ci/// # use nom::combinator::rest;
6146855e09eSopenharmony_ci/// # use nom::branch::alt;
6156855e09eSopenharmony_ci/// # use nom::sequence::preceded;
6166855e09eSopenharmony_ci/// use nom::combinator::cut;
6176855e09eSopenharmony_ci/// # fn main() {
6186855e09eSopenharmony_ci///
6196855e09eSopenharmony_ci/// fn parser(input: &str) -> IResult<&str, &str> {
6206855e09eSopenharmony_ci///   alt((
6216855e09eSopenharmony_ci///     preceded(one_of("+-"), cut(digit1)),
6226855e09eSopenharmony_ci///     rest
6236855e09eSopenharmony_ci///   ))(input)
6246855e09eSopenharmony_ci/// }
6256855e09eSopenharmony_ci///
6266855e09eSopenharmony_ci/// assert_eq!(parser("+10 ab"), Ok((" ab", "10")));
6276855e09eSopenharmony_ci/// assert_eq!(parser("ab"), Ok(("", "ab")));
6286855e09eSopenharmony_ci/// assert_eq!(parser("+"), Err(Err::Failure(Error { input: "", code: ErrorKind::Digit })));
6296855e09eSopenharmony_ci/// # }
6306855e09eSopenharmony_ci/// ```
6316855e09eSopenharmony_cipub fn cut<I, O, E: ParseError<I>, F>(mut parser: F) -> impl FnMut(I) -> IResult<I, O, E>
6326855e09eSopenharmony_ciwhere
6336855e09eSopenharmony_ci  F: Parser<I, O, E>,
6346855e09eSopenharmony_ci{
6356855e09eSopenharmony_ci  move |input: I| match parser.parse(input) {
6366855e09eSopenharmony_ci    Err(Err::Error(e)) => Err(Err::Failure(e)),
6376855e09eSopenharmony_ci    rest => rest,
6386855e09eSopenharmony_ci  }
6396855e09eSopenharmony_ci}
6406855e09eSopenharmony_ci
6416855e09eSopenharmony_ci/// automatically converts the child parser's result to another type
6426855e09eSopenharmony_ci///
6436855e09eSopenharmony_ci/// it will be able to convert the output value and the error value
6446855e09eSopenharmony_ci/// as long as the `Into` implementations are available
6456855e09eSopenharmony_ci///
6466855e09eSopenharmony_ci/// ```rust
6476855e09eSopenharmony_ci/// # use nom::IResult;
6486855e09eSopenharmony_ci/// use nom::combinator::into;
6496855e09eSopenharmony_ci/// use nom::character::complete::alpha1;
6506855e09eSopenharmony_ci/// # fn main() {
6516855e09eSopenharmony_ci///
6526855e09eSopenharmony_ci///  fn parser1(i: &str) -> IResult<&str, &str> {
6536855e09eSopenharmony_ci///    alpha1(i)
6546855e09eSopenharmony_ci///  }
6556855e09eSopenharmony_ci///
6566855e09eSopenharmony_ci///  let mut parser2 = into(parser1);
6576855e09eSopenharmony_ci///
6586855e09eSopenharmony_ci/// // the parser converts the &str output of the child parser into a Vec<u8>
6596855e09eSopenharmony_ci/// let bytes: IResult<&str, Vec<u8>> = parser2("abcd");
6606855e09eSopenharmony_ci/// assert_eq!(bytes, Ok(("", vec![97, 98, 99, 100])));
6616855e09eSopenharmony_ci/// # }
6626855e09eSopenharmony_ci/// ```
6636855e09eSopenharmony_cipub fn into<I, O1, O2, E1, E2, F>(mut parser: F) -> impl FnMut(I) -> IResult<I, O2, E2>
6646855e09eSopenharmony_ciwhere
6656855e09eSopenharmony_ci  O1: Into<O2>,
6666855e09eSopenharmony_ci  E1: Into<E2>,
6676855e09eSopenharmony_ci  E1: ParseError<I>,
6686855e09eSopenharmony_ci  E2: ParseError<I>,
6696855e09eSopenharmony_ci  F: Parser<I, O1, E1>,
6706855e09eSopenharmony_ci{
6716855e09eSopenharmony_ci  //map(parser, Into::into)
6726855e09eSopenharmony_ci  move |input: I| match parser.parse(input) {
6736855e09eSopenharmony_ci    Ok((i, o)) => Ok((i, o.into())),
6746855e09eSopenharmony_ci    Err(Err::Error(e)) => Err(Err::Error(e.into())),
6756855e09eSopenharmony_ci    Err(Err::Failure(e)) => Err(Err::Failure(e.into())),
6766855e09eSopenharmony_ci    Err(Err::Incomplete(e)) => Err(Err::Incomplete(e)),
6776855e09eSopenharmony_ci  }
6786855e09eSopenharmony_ci}
6796855e09eSopenharmony_ci
6806855e09eSopenharmony_ci/// Creates an iterator from input data and a parser.
6816855e09eSopenharmony_ci///
6826855e09eSopenharmony_ci/// Call the iterator's [ParserIterator::finish] method to get the remaining input if successful,
6836855e09eSopenharmony_ci/// or the error value if we encountered an error.
6846855e09eSopenharmony_ci///
6856855e09eSopenharmony_ci/// On [`Err::Error`], iteration will stop. To instead chain an error up, see [`cut`].
6866855e09eSopenharmony_ci///
6876855e09eSopenharmony_ci/// ```rust
6886855e09eSopenharmony_ci/// use nom::{combinator::iterator, IResult, bytes::complete::tag, character::complete::alpha1, sequence::terminated};
6896855e09eSopenharmony_ci/// use std::collections::HashMap;
6906855e09eSopenharmony_ci///
6916855e09eSopenharmony_ci/// let data = "abc|defg|hijkl|mnopqr|123";
6926855e09eSopenharmony_ci/// let mut it = iterator(data, terminated(alpha1, tag("|")));
6936855e09eSopenharmony_ci///
6946855e09eSopenharmony_ci/// let parsed = it.map(|v| (v, v.len())).collect::<HashMap<_,_>>();
6956855e09eSopenharmony_ci/// let res: IResult<_,_> = it.finish();
6966855e09eSopenharmony_ci///
6976855e09eSopenharmony_ci/// assert_eq!(parsed, [("abc", 3usize), ("defg", 4), ("hijkl", 5), ("mnopqr", 6)].iter().cloned().collect());
6986855e09eSopenharmony_ci/// assert_eq!(res, Ok(("123", ())));
6996855e09eSopenharmony_ci/// ```
7006855e09eSopenharmony_cipub fn iterator<Input, Output, Error, F>(input: Input, f: F) -> ParserIterator<Input, Error, F>
7016855e09eSopenharmony_ciwhere
7026855e09eSopenharmony_ci  F: Parser<Input, Output, Error>,
7036855e09eSopenharmony_ci  Error: ParseError<Input>,
7046855e09eSopenharmony_ci{
7056855e09eSopenharmony_ci  ParserIterator {
7066855e09eSopenharmony_ci    iterator: f,
7076855e09eSopenharmony_ci    input,
7086855e09eSopenharmony_ci    state: Some(State::Running),
7096855e09eSopenharmony_ci  }
7106855e09eSopenharmony_ci}
7116855e09eSopenharmony_ci
7126855e09eSopenharmony_ci/// Main structure associated to the [iterator] function.
7136855e09eSopenharmony_cipub struct ParserIterator<I, E, F> {
7146855e09eSopenharmony_ci  iterator: F,
7156855e09eSopenharmony_ci  input: I,
7166855e09eSopenharmony_ci  state: Option<State<E>>,
7176855e09eSopenharmony_ci}
7186855e09eSopenharmony_ci
7196855e09eSopenharmony_ciimpl<I: Clone, E, F> ParserIterator<I, E, F> {
7206855e09eSopenharmony_ci  /// Returns the remaining input if parsing was successful, or the error if we encountered an error.
7216855e09eSopenharmony_ci  pub fn finish(mut self) -> IResult<I, (), E> {
7226855e09eSopenharmony_ci    match self.state.take().unwrap() {
7236855e09eSopenharmony_ci      State::Running | State::Done => Ok((self.input, ())),
7246855e09eSopenharmony_ci      State::Failure(e) => Err(Err::Failure(e)),
7256855e09eSopenharmony_ci      State::Incomplete(i) => Err(Err::Incomplete(i)),
7266855e09eSopenharmony_ci    }
7276855e09eSopenharmony_ci  }
7286855e09eSopenharmony_ci}
7296855e09eSopenharmony_ci
7306855e09eSopenharmony_ciimpl<'a, Input, Output, Error, F> core::iter::Iterator for &'a mut ParserIterator<Input, Error, F>
7316855e09eSopenharmony_ciwhere
7326855e09eSopenharmony_ci  F: FnMut(Input) -> IResult<Input, Output, Error>,
7336855e09eSopenharmony_ci  Input: Clone,
7346855e09eSopenharmony_ci{
7356855e09eSopenharmony_ci  type Item = Output;
7366855e09eSopenharmony_ci
7376855e09eSopenharmony_ci  fn next(&mut self) -> Option<Self::Item> {
7386855e09eSopenharmony_ci    if let State::Running = self.state.take().unwrap() {
7396855e09eSopenharmony_ci      let input = self.input.clone();
7406855e09eSopenharmony_ci
7416855e09eSopenharmony_ci      match (self.iterator)(input) {
7426855e09eSopenharmony_ci        Ok((i, o)) => {
7436855e09eSopenharmony_ci          self.input = i;
7446855e09eSopenharmony_ci          self.state = Some(State::Running);
7456855e09eSopenharmony_ci          Some(o)
7466855e09eSopenharmony_ci        }
7476855e09eSopenharmony_ci        Err(Err::Error(_)) => {
7486855e09eSopenharmony_ci          self.state = Some(State::Done);
7496855e09eSopenharmony_ci          None
7506855e09eSopenharmony_ci        }
7516855e09eSopenharmony_ci        Err(Err::Failure(e)) => {
7526855e09eSopenharmony_ci          self.state = Some(State::Failure(e));
7536855e09eSopenharmony_ci          None
7546855e09eSopenharmony_ci        }
7556855e09eSopenharmony_ci        Err(Err::Incomplete(i)) => {
7566855e09eSopenharmony_ci          self.state = Some(State::Incomplete(i));
7576855e09eSopenharmony_ci          None
7586855e09eSopenharmony_ci        }
7596855e09eSopenharmony_ci      }
7606855e09eSopenharmony_ci    } else {
7616855e09eSopenharmony_ci      None
7626855e09eSopenharmony_ci    }
7636855e09eSopenharmony_ci  }
7646855e09eSopenharmony_ci}
7656855e09eSopenharmony_ci
7666855e09eSopenharmony_cienum State<E> {
7676855e09eSopenharmony_ci  Running,
7686855e09eSopenharmony_ci  Done,
7696855e09eSopenharmony_ci  Failure(E),
7706855e09eSopenharmony_ci  Incomplete(Needed),
7716855e09eSopenharmony_ci}
7726855e09eSopenharmony_ci
7736855e09eSopenharmony_ci/// a parser which always succeeds with given value without consuming any input.
7746855e09eSopenharmony_ci///
7756855e09eSopenharmony_ci/// It can be used for example as the last alternative in `alt` to
7766855e09eSopenharmony_ci/// specify the default case.
7776855e09eSopenharmony_ci///
7786855e09eSopenharmony_ci/// ```rust
7796855e09eSopenharmony_ci/// # use nom::{Err,error::ErrorKind, IResult};
7806855e09eSopenharmony_ci/// use nom::branch::alt;
7816855e09eSopenharmony_ci/// use nom::combinator::{success, value};
7826855e09eSopenharmony_ci/// use nom::character::complete::char;
7836855e09eSopenharmony_ci/// # fn main() {
7846855e09eSopenharmony_ci///
7856855e09eSopenharmony_ci/// let mut parser = success::<_,_,(_,ErrorKind)>(10);
7866855e09eSopenharmony_ci/// assert_eq!(parser("xyz"), Ok(("xyz", 10)));
7876855e09eSopenharmony_ci///
7886855e09eSopenharmony_ci/// let mut sign = alt((value(-1, char('-')), value(1, char('+')), success::<_,_,(_,ErrorKind)>(1)));
7896855e09eSopenharmony_ci/// assert_eq!(sign("+10"), Ok(("10", 1)));
7906855e09eSopenharmony_ci/// assert_eq!(sign("-10"), Ok(("10", -1)));
7916855e09eSopenharmony_ci/// assert_eq!(sign("10"), Ok(("10", 1)));
7926855e09eSopenharmony_ci/// # }
7936855e09eSopenharmony_ci/// ```
7946855e09eSopenharmony_cipub fn success<I, O: Clone, E: ParseError<I>>(val: O) -> impl Fn(I) -> IResult<I, O, E> {
7956855e09eSopenharmony_ci  move |input: I| Ok((input, val.clone()))
7966855e09eSopenharmony_ci}
7976855e09eSopenharmony_ci
7986855e09eSopenharmony_ci/// A parser which always fails.
7996855e09eSopenharmony_ci///
8006855e09eSopenharmony_ci/// ```rust
8016855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, IResult};
8026855e09eSopenharmony_ci/// use nom::combinator::fail;
8036855e09eSopenharmony_ci///
8046855e09eSopenharmony_ci/// let s = "string";
8056855e09eSopenharmony_ci/// assert_eq!(fail::<_, &str, _>(s), Err(Err::Error((s, ErrorKind::Fail))));
8066855e09eSopenharmony_ci/// ```
8076855e09eSopenharmony_cipub fn fail<I, O, E: ParseError<I>>(i: I) -> IResult<I, O, E> {
8086855e09eSopenharmony_ci  Err(Err::Error(E::from_error_kind(i, ErrorKind::Fail)))
8096855e09eSopenharmony_ci}
810