1#![allow(dead_code)] 2 3use nom::bytes::streaming::tag; 4use nom::character::streaming::digit1 as digit; 5use nom::combinator::verify; 6use nom::error::{ErrorKind, ParseError}; 7#[cfg(feature = "alloc")] 8use nom::multi::count; 9use nom::sequence::terminated; 10use nom::IResult; 11 12#[derive(Debug)] 13pub struct CustomError(String); 14 15impl<'a> From<(&'a str, ErrorKind)> for CustomError { 16 fn from(error: (&'a str, ErrorKind)) -> Self { 17 CustomError(format!("error code was: {:?}", error)) 18 } 19} 20 21impl<'a> ParseError<&'a str> for CustomError { 22 fn from_error_kind(_: &'a str, kind: ErrorKind) -> Self { 23 CustomError(format!("error code was: {:?}", kind)) 24 } 25 26 fn append(_: &'a str, kind: ErrorKind, other: CustomError) -> Self { 27 CustomError(format!("{:?}\nerror code was: {:?}", other, kind)) 28 } 29} 30 31fn test1(input: &str) -> IResult<&str, &str, CustomError> { 32 //fix_error!(input, CustomError, tag!("abcd")) 33 tag("abcd")(input) 34} 35 36fn test2(input: &str) -> IResult<&str, &str, CustomError> { 37 //terminated!(input, test1, fix_error!(CustomError, digit)) 38 terminated(test1, digit)(input) 39} 40 41fn test3(input: &str) -> IResult<&str, &str, CustomError> { 42 verify(test1, |s: &str| s.starts_with("abcd"))(input) 43} 44 45#[cfg(feature = "alloc")] 46fn test4(input: &str) -> IResult<&str, Vec<&str>, CustomError> { 47 count(test1, 4)(input) 48} 49