diff options
Diffstat (limited to 'src/parse/ast/statement.rs')
| -rw-r--r-- | src/parse/ast/statement.rs | 39 |
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(()) + } +} |
