49 lines
1.1 KiB
Rust
49 lines
1.1 KiB
Rust
use crate::ast::expression::expression_node::ExpressionNode;
|
|
use from_variants::FromVariants;
|
|
|
|
#[derive(FromVariants, Debug)]
|
|
pub enum Statement {
|
|
Expression(ExpressionStatement),
|
|
Print(PrintStatement),
|
|
VariableAssignment(VariableAssignmentStatement),
|
|
}
|
|
|
|
macro_rules! all_variants {
|
|
($expr:expr, $val_name:ident => $expr_arm:expr) => {
|
|
{
|
|
use match_any::match_any;
|
|
use $crate::ast::statement::statement_node::*;
|
|
match_any!($expr, Statement::Expression($val_name) | Statement::Print($val_name) | Statement::VariableAssignment($val_name) => $expr_arm)
|
|
}
|
|
};
|
|
}
|
|
pub(crate) use all_variants;
|
|
|
|
#[derive(Debug)]
|
|
pub struct ExpressionStatement(pub ExpressionNode);
|
|
impl ExpressionStatement {
|
|
pub fn new(expr: ExpressionNode) -> Self {
|
|
Self(expr)
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct PrintStatement(pub ExpressionNode);
|
|
impl PrintStatement {
|
|
pub fn new(expr: ExpressionNode) -> Self {
|
|
Self(expr)
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct VariableAssignmentStatement {
|
|
pub var_name: String,
|
|
pub node: ExpressionNode,
|
|
}
|
|
|
|
impl VariableAssignmentStatement {
|
|
pub fn new(var_name: String, node: ExpressionNode) -> Self {
|
|
Self { var_name, node }
|
|
}
|
|
}
|