summaryrefslogtreecommitdiffstats
path: root/third_party/rust/nom/src/character/macros.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/nom/src/character/macros.rs')
-rw-r--r--third_party/rust/nom/src/character/macros.rs112
1 files changed, 112 insertions, 0 deletions
diff --git a/third_party/rust/nom/src/character/macros.rs b/third_party/rust/nom/src/character/macros.rs
new file mode 100644
index 0000000000..097ee409fe
--- /dev/null
+++ b/third_party/rust/nom/src/character/macros.rs
@@ -0,0 +1,112 @@
+/// Character level parsers
+
+/// matches one of the provided characters
+///
+/// # Example
+/// ```
+/// # #[macro_use] extern crate nom;
+/// # fn main() {
+/// named!(simple<char>, 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<char>, none_of!(&b"abc"[..]));
+/// assert_eq!(no_letter_a(b"123"), Ok((&b"23"[..], '1')));
+///
+/// named!(err_on_single_quote<char>, 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>, 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<char>, 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<char>, 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>, 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')));
+ }
+}