crftng-intrprtrs/src/ast/statement/statement_node.rs

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 }
}
}