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