dust/src/abstract_tree/while.rs

46 lines
1.2 KiB
Rust
Raw Normal View History

2023-10-07 02:45:36 +00:00
use serde::{Deserialize, Serialize};
2023-10-10 17:29:11 +00:00
use tree_sitter::Node;
2023-10-07 02:45:36 +00:00
2023-10-31 13:31:10 +00:00
use crate::{AbstractTree, Expression, Map, Result, Statement, Value};
2023-10-07 02:45:36 +00:00
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
pub struct While {
expression: Expression,
2023-10-31 13:31:10 +00:00
statement: Statement,
2023-10-07 02:45:36 +00:00
}
impl AbstractTree for While {
2023-10-10 17:29:11 +00:00
fn from_syntax_node(source: &str, node: Node) -> crate::Result<Self> {
2023-10-07 02:45:36 +00:00
debug_assert_eq!("while", node.kind());
let expression_node = node.child(1).unwrap();
2023-10-10 17:29:11 +00:00
let expression = Expression::from_syntax_node(source, expression_node)?;
2023-10-07 02:45:36 +00:00
2023-10-31 13:31:10 +00:00
let statement_node = node.child(3).unwrap();
let statement = Statement::from_syntax_node(source, statement_node)?;
2023-10-07 02:45:36 +00:00
2023-10-31 13:31:10 +00:00
Ok(While {
expression,
statement,
})
2023-10-07 02:45:36 +00:00
}
2023-10-25 20:44:50 +00:00
fn run(&self, source: &str, context: &mut Map) -> Result<Value> {
2023-10-10 17:29:11 +00:00
while self.expression.run(source, context)?.as_boolean()? {
2023-10-31 13:31:10 +00:00
self.statement.run(source, context)?;
2023-10-07 02:45:36 +00:00
}
2023-10-31 13:31:10 +00:00
Ok(Value::Empty)
2023-10-07 02:45:36 +00:00
}
}
#[cfg(test)]
mod tests {
use crate::evaluate;
#[test]
fn evalualate_while_loop() {
2023-10-09 19:54:47 +00:00
assert_eq!(evaluate("while false { 'foo' }"), Ok(crate::Value::Empty))
2023-10-07 02:45:36 +00:00
}
}