blob: bccdd42f80e698e271302f8b587043dc5d9a599e [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)*) {
28 ::nom::IResult::Done(i, o) => ::nom::IResult::Done(i, Some(o)),
David Tolnayb5a7b142016-09-13 22:46:39 -070029 ::nom::IResult::Error => ::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)*) {
41 ::nom::IResult::Done(i, o) => ::nom::IResult::Done(i, o),
David Tolnayb5a7b142016-09-13 22:46:39 -070042 ::nom::IResult::Error => ::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 Tolnay3a14d6b2016-09-14 00:00:06 -070049 value!($i, ())
David Tolnayb79ee962016-09-04 09:39:20 -070050 };
51}