mini_builder_rs/evaluator/
block.rs

1use crate::{parser::expression::Expression, tokenizer::token::TokenType};
2
3pub type Blocks<'a, 'b> = Vec<Box<Block<'a, 'b>>>;
4
5/// A block that is produced by [super::evaluator::EvaluatorBuilder] and can be
6/// evaluated using a [super::evaluation_context::EvaluationContext].
7#[derive(Debug)]
8pub enum Block<'a, 'b> {
9	Source(&'b str),
10	Expression(&'a Expression<'b>),
11	Assignment(&'b str, TokenType, &'a Expression<'b>),
12	If(Box<IfBlock<'a, 'b>>),
13	For(Box<ForBlock<'a, 'b>>),
14}
15
16/// If-Else chain control flow block.
17#[derive(Debug)]
18pub struct IfBlock<'a, 'b> {
19	pub if_blocks: Vec<(&'a Expression<'b>, Blocks<'a, 'b>)>,
20	pub else_blocks: Option<Blocks<'a, 'b>>,
21}
22
23impl<'a, 'b> IfBlock<'a, 'b> {
24	pub fn new(
25		if_blocks: Vec<(&'a Expression<'b>, Blocks<'a, 'b>)>,
26		else_blocks: Option<Blocks<'a, 'b>>,
27	) -> Self {
28		Self {
29			if_blocks,
30			else_blocks,
31		}
32	}
33}
34
35/// For-Each control flow block.
36#[derive(Debug)]
37pub struct ForBlock<'a, 'b> {
38	pub var_name: &'b str,
39	pub expression: &'a Expression<'b>,
40	pub blocks: Blocks<'a, 'b>,
41}
42
43impl<'a, 'b> ForBlock<'a, 'b> {
44	pub fn new(var_name: &'b str, expression: &'a Expression<'b>, blocks: Blocks<'a, 'b>) -> Self {
45		Self {
46			var_name,
47			expression,
48			blocks,
49		}
50	}
51}