diff options
Diffstat (limited to 'src/parse/macros.rs')
| -rw-r--r-- | src/parse/macros.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/parse/macros.rs b/src/parse/macros.rs new file mode 100644 index 0000000..0b09152 --- /dev/null +++ b/src/parse/macros.rs @@ -0,0 +1,59 @@ +#[macro_export] +macro_rules! check { + ($self:ident, $($variant:pat_param)|+) => { + if let Some(token) = $self.tokens.peek() { + if let Token {variant: $( $variant )|+, ..} = token { + true + } else { + false + } + } else { + false + } + }; +} + +#[macro_export] +macro_rules! consume { + ($self:ident, $($variant:pat_param)|+) => { + if let Some(token) = $self.tokens.next() { + if let Token {variant: $( $variant )|+, ..} = token { + Ok(token) + } else { + Err(anyhow!( + // Make a better error message + "Received unexpected token: '{:?}'.", + token.variant + )) + } + } else { + // Here too + Err(anyhow!("Expected a token.")) + } + }; +} + +#[macro_export] +macro_rules! consume_if { + ($self:ident, $($variant:pat_param)|+) => { + if let Some(token) = $self.tokens.peek() { + if let Token {variant: $( $variant )|+, ..} = token { + Some($self.tokens.next().unwrap()) + } else { + None + } + } else { + None + } + }; +} + +#[macro_export] +macro_rules! inner { + ($token:expr, $variant:path ) => { + match $token.variant { + $variant(inner) => inner, + _ => panic!("Tried getting inner content of incorrect variant.") + } + }; +} \ No newline at end of file |
