about summary refs log tree commit diff
path: root/src/parse/ast/statement.rs
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2021-10-20 22:15:08 +0200
committerMel <einebeere@gmail.com>2021-10-20 22:15:08 +0200
commita4980b8dbf1394c2b302f1de7c72d2264426b86e (patch)
tree97160332c53d8036ea3f6865ff60dabb2c55ef49 /src/parse/ast/statement.rs
parent8d5a74566beba45f4642838102c5a066ef2aa18d (diff)
downloadrabbithole-a4980b8dbf1394c2b302f1de7c72d2264426b86e.tar.zst
rabbithole-a4980b8dbf1394c2b302f1de7c72d2264426b86e.zip
Statement parsing.
Diffstat (limited to 'src/parse/ast/statement.rs')
-rw-r--r--src/parse/ast/statement.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/parse/ast/statement.rs b/src/parse/ast/statement.rs
new file mode 100644
index 0000000..eec589e
--- /dev/null
+++ b/src/parse/ast/statement.rs
@@ -0,0 +1,39 @@
+use std::fmt::Display;
+
+use super::expression::Expression;
+
+#[derive(Debug)]
+pub enum Statement {
+    Expression(Expression),
+    Print(Expression),
+    Return(Expression),
+}
+
+impl Display for Statement {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        self.nested_fmt(f, 0)
+    }
+}
+
+impl Statement {
+    pub(crate) fn nested_fmt(
+        &self,
+        f: &mut std::fmt::Formatter<'_>,
+        depth: usize,
+    ) -> std::fmt::Result {
+        let pad = "  ".repeat(depth);
+        match self {
+            Statement::Expression(expression) => expression.nested_fmt(f, depth)?,
+            Statement::Print(expression) => {
+                writeln!(f, "{}Print:", pad)?;
+                expression.nested_fmt(f, depth + 1)?;
+            }
+            Statement::Return(expression) => {
+                writeln!(f, "{}Return:", pad)?;
+                expression.nested_fmt(f, depth + 1)?;
+            }
+        }
+
+        Ok(())
+    }
+}