/// Character level parsers /// matches one of the provided characters /// /// # Example /// ``` /// # #[macro_use] extern crate nom; /// # fn main() { /// named!(simple, one_of!(&b"abc"[..])); /// assert_eq!(simple(b"a123"), Ok((&b"123"[..], 'a'))); /// /// named!(a_or_b<&str, char>, one_of!("ab汉")); /// assert_eq!(a_or_b("汉jiosfe"), Ok(("jiosfe", '汉'))); /// # } /// ``` #[macro_export(local_inner_macros)] macro_rules! one_of ( ($i:expr, $inp: expr) => ( $crate::character::streaming::one_of($inp)($i) ); ); /// matches anything but the provided characters /// /// # Example /// ``` /// # #[macro_use] extern crate nom; /// # use nom::{Err,error::ErrorKind}; /// # fn main() { /// named!(no_letter_a, none_of!(&b"abc"[..])); /// assert_eq!(no_letter_a(b"123"), Ok((&b"23"[..], '1'))); /// /// named!(err_on_single_quote, none_of!(&b"'"[..])); /// assert_eq!(err_on_single_quote(b"'jiosfe"), Err(Err::Error(error_position!(&b"'jiosfe"[..], ErrorKind::NoneOf)))); /// # } /// ``` #[macro_export(local_inner_macros)] macro_rules! none_of ( ($i:expr, $inp: expr) => ( $crate::character::streaming::none_of($inp)($i) ); ); /// matches one character: `char!(char) => &[u8] -> IResult<&[u8], char> /// /// # Example /// ``` /// # #[macro_use] extern crate nom; /// # use nom::{Err,error::ErrorKind}; /// # fn main() { /// named!(match_letter_a, char!('a')); /// assert_eq!(match_letter_a(b"abc"), Ok((&b"bc"[..],'a'))); /// /// assert_eq!(match_letter_a(b"123cdef"), Err(Err::Error(error_position!(&b"123cdef"[..], ErrorKind::Char)))); /// # } /// ``` #[macro_export(local_inner_macros)] macro_rules! char ( ($i:expr, $c: expr) => ( $crate::character::streaming::char($c)($i) ); ); #[cfg(test)] mod tests { use crate::internal::Err; use crate::error::ErrorKind; #[test] fn one_of() { named!(f, one_of!("ab")); let a = &b"abcd"[..]; assert_eq!(f(a), Ok((&b"bcd"[..], 'a'))); let b = &b"cde"[..]; assert_eq!(f(b), Err(Err::Error(error_position!(b, ErrorKind::OneOf)))); named!(utf8(&str) -> char, one_of!("+\u{FF0B}")); assert!(utf8("+").is_ok()); assert!(utf8("\u{FF0B}").is_ok()); } #[test] fn none_of() { named!(f, none_of!("ab")); let a = &b"abcd"[..]; assert_eq!(f(a), Err(Err::Error(error_position!(a, ErrorKind::NoneOf)))); let b = &b"cde"[..]; assert_eq!(f(b), Ok((&b"de"[..], 'c'))); } #[test] fn char() { named!(f, char!('c')); let a = &b"abcd"[..]; assert_eq!(f(a), Err(Err::Error(error_position!(a, ErrorKind::Char)))); let b = &b"cde"[..]; assert_eq!(f(b), Ok((&b"de"[..], 'c'))); } #[test] fn char_str() { named!(f<&str, char>, char!('c')); let a = &"abcd"[..]; assert_eq!(f(a), Err(Err::Error(error_position!(a, ErrorKind::Char)))); let b = &"cde"[..]; assert_eq!(f(b), Ok((&"de"[..], 'c'))); } }