about summary refs log tree commit diff
path: root/src/parse/macros.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/macros.rs')
-rw-r--r--src/parse/macros.rs59
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