dust/src/abstract_tree/statement.rs

63 lines
2.3 KiB
Rust
Raw Normal View History

2023-10-06 17:32:58 +00:00
use serde::{Deserialize, Serialize};
use tree_sitter::Node;
use crate::{
2023-10-09 19:54:47 +00:00
r#while::While, AbstractTree, Assignment, Error, Expression, IfElse, Match, Result, Value,
VariableMap,
2023-10-06 17:32:58 +00:00
};
/// Abstract representation of a statement.
///
2023-10-09 19:54:47 +00:00
/// A statement may evaluate to an Empty value when run. If a Statement is an
/// Expression, it will always return a non-empty value when run.
2023-10-06 17:32:58 +00:00
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
pub enum Statement {
Assignment(Box<Assignment>),
Expression(Expression),
IfElse(Box<IfElse>),
Match(Match),
2023-10-07 02:45:36 +00:00
While(Box<While>),
2023-10-06 17:32:58 +00:00
}
impl AbstractTree for Statement {
2023-10-10 17:29:11 +00:00
fn from_syntax_node(source: &str, node: Node) -> Result<Self> {
2023-10-06 17:32:58 +00:00
debug_assert_eq!("statement", node.kind());
let child = node.child(0).unwrap();
match child.kind() {
"assignment" => Ok(Statement::Assignment(Box::new(
2023-10-10 17:29:11 +00:00
Assignment::from_syntax_node(source, child)?,
2023-10-06 17:32:58 +00:00
))),
"expression" => Ok(Self::Expression(Expression::from_syntax_node(
2023-10-10 17:29:11 +00:00
source, child,
2023-10-06 17:32:58 +00:00
)?)),
"if_else" => Ok(Statement::IfElse(Box::new(IfElse::from_syntax_node(
2023-10-10 17:29:11 +00:00
source, child,
2023-10-06 17:32:58 +00:00
)?))),
"tool" => Ok(Statement::IfElse(Box::new(IfElse::from_syntax_node(
2023-10-10 17:29:11 +00:00
source, child,
2023-10-06 17:32:58 +00:00
)?))),
2023-10-07 02:45:36 +00:00
"while" => Ok(Statement::While(Box::new(While::from_syntax_node(
2023-10-10 17:29:11 +00:00
source, child,
2023-10-07 02:45:36 +00:00
)?))),
2023-10-10 17:29:11 +00:00
_ => Err(Error::UnexpectedSyntaxNode {
2023-10-06 17:32:58 +00:00
expected: "assignment, expression, if...else or tool",
actual: child.kind(),
location: child.start_position(),
2023-10-10 17:29:11 +00:00
relevant_source: source[child.byte_range()].to_string(),
2023-10-06 17:32:58 +00:00
}),
}
}
2023-10-10 17:29:11 +00:00
fn run(&self, source: &str, context: &mut VariableMap) -> Result<Value> {
2023-10-06 17:32:58 +00:00
match self {
2023-10-10 17:29:11 +00:00
Statement::Assignment(assignment) => assignment.run(source, context),
Statement::Expression(expression) => expression.run(source, context),
Statement::IfElse(if_else) => if_else.run(source, context),
Statement::Match(r#match) => r#match.run(source, context),
Statement::While(r#while) => r#while.run(source, context),
2023-10-06 17:32:58 +00:00
}
}
}