blob: 2a429e9117672d1b8ae7c3a713b82d2a7ae7902a [file] [log] [blame]
David Tolnay86eca752016-09-04 11:26:41 -07001#![cfg(feature = "parsing")]
2
David Tolnayb5a7b142016-09-13 22:46:39 -07003use nom::IResult;
David Tolnayb79ee962016-09-04 09:39:20 -07004
5macro_rules! punct {
6 ($i:expr, $punct:expr) => {
David Tolnay13e5da42016-09-04 16:18:34 -07007 $crate::helper::punct($i, $punct)
David Tolnayb79ee962016-09-04 09:39:20 -07008 };
9}
10
David Tolnay13e5da42016-09-04 16:18:34 -070011pub fn punct<'a>(input: &'a str, token: &'static str) -> IResult<&'a str, &'a str> {
David Tolnayaed77b02016-09-23 20:50:31 -070012 for (i, ch) in input.char_indices() {
David Tolnay13e5da42016-09-04 16:18:34 -070013 if !ch.is_whitespace() {
14 return if input[i..].starts_with(token) {
15 let end = i + token.len();
16 IResult::Done(&input[end..], &input[i..end])
17 } else {
David Tolnayb5a7b142016-09-13 22:46:39 -070018 IResult::Error
David Tolnay13e5da42016-09-04 16:18:34 -070019 };
20 }
21 }
David Tolnayb5a7b142016-09-13 22:46:39 -070022 IResult::Error
David Tolnay13e5da42016-09-04 16:18:34 -070023}
24
David Tolnayb5a7b142016-09-13 22:46:39 -070025macro_rules! option {
26 ($i:expr, $submac:ident!( $($args:tt)* )) => {
David Tolnayf6ccb832016-09-04 15:00:56 -070027 match $submac!($i, $($args)*) {
David Tolnayfa0edf22016-09-23 22:58:24 -070028 $crate::nom::IResult::Done(i, o) => $crate::nom::IResult::Done(i, Some(o)),
29 $crate::nom::IResult::Error => $crate::nom::IResult::Done($i, None),
David Tolnayf6ccb832016-09-04 15:00:56 -070030 }
David Tolnayb5a7b142016-09-13 22:46:39 -070031 };
David Tolnayf6ccb832016-09-04 15:00:56 -070032
David Tolnayb5a7b142016-09-13 22:46:39 -070033 ($i:expr, $f:expr) => {
34 option!($i, call!($f));
35 };
36}
37
38macro_rules! opt_vec {
39 ($i:expr, $submac:ident!( $($args:tt)* )) => {
David Tolnayb79ee962016-09-04 09:39:20 -070040 match $submac!($i, $($args)*) {
David Tolnayfa0edf22016-09-23 22:58:24 -070041 $crate::nom::IResult::Done(i, o) => $crate::nom::IResult::Done(i, o),
42 $crate::nom::IResult::Error => $crate::nom::IResult::Done($i, Vec::new()),
David Tolnayb79ee962016-09-04 09:39:20 -070043 }
David Tolnayb5a7b142016-09-13 22:46:39 -070044 };
45}
David Tolnayb79ee962016-09-04 09:39:20 -070046
47macro_rules! epsilon {
48 ($i:expr,) => {
David Tolnayfa0edf22016-09-23 22:58:24 -070049 $crate::nom::IResult::Done($i, ())
50 };
51}
52
53macro_rules! tap {
54 ($i:expr, $name:ident : $submac:ident!( $($args:tt)* ) => $e:expr) => {
55 match $submac!($i, $($args)*) {
56 $crate::nom::IResult::Done(i, o) => {
57 let $name = o;
58 $e;
59 $crate::nom::IResult::Done(i, ())
60 }
61 $crate::nom::IResult::Error => $crate::nom::IResult::Error,
62 }
63 };
64
65 ($i:expr, $name:ident : $f:expr => $e:expr) => {
66 tap!($i, $name: call!($f) => $e);
David Tolnayb79ee962016-09-04 09:39:20 -070067 };
68}