1
0
dust/src/abstract_tree/logic.rs

58 lines
2.0 KiB
Rust
Raw Normal View History

2024-02-26 21:27:01 +00:00
use crate::{context::Context, error::RuntimeError, Value};
2024-02-25 18:49:26 +00:00
2024-02-26 21:27:01 +00:00
use super::{AbstractTree, Expression};
2024-02-25 18:49:26 +00:00
2024-02-25 19:26:22 +00:00
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
2024-02-26 21:27:01 +00:00
pub enum Logic<'src> {
Equal(Expression<'src>, Expression<'src>),
NotEqual(Expression<'src>, Expression<'src>),
Greater(Expression<'src>, Expression<'src>),
Less(Expression<'src>, Expression<'src>),
GreaterOrEqual(Expression<'src>, Expression<'src>),
LessOrEqual(Expression<'src>, Expression<'src>),
And(Expression<'src>, Expression<'src>),
Or(Expression<'src>, Expression<'src>),
Not(Expression<'src>),
2024-02-25 18:49:26 +00:00
}
2024-02-26 21:27:01 +00:00
impl<'src> AbstractTree for Logic<'src> {
2024-02-25 19:26:22 +00:00
fn run(self, _context: &Context) -> Result<Value, RuntimeError> {
let boolean = match self {
Logic::Equal(left, right) => left.run(_context)? == right.run(_context)?,
Logic::NotEqual(left, right) => left.run(_context)? != right.run(_context)?,
Logic::Greater(left, right) => left.run(_context)? > right.run(_context)?,
Logic::Less(left, right) => left.run(_context)? < right.run(_context)?,
Logic::GreaterOrEqual(left, right) => left.run(_context)? >= right.run(_context)?,
Logic::LessOrEqual(left, right) => left.run(_context)? <= right.run(_context)?,
Logic::And(left, right) => {
left.run(_context)?.as_boolean()? && right.run(_context)?.as_boolean()?
}
Logic::Or(left, right) => {
left.run(_context)?.as_boolean()? || right.run(_context)?.as_boolean()?
}
Logic::Not(statement) => !statement.run(_context)?.as_boolean()?,
};
Ok(Value::boolean(boolean))
}
}
#[cfg(test)]
mod tests {
2024-02-26 21:27:01 +00:00
use crate::abstract_tree::{Expression, ValueNode};
2024-02-25 19:26:22 +00:00
use super::*;
#[test]
fn equal() {
assert!(Logic::Equal(
2024-02-26 21:27:01 +00:00
Expression::Value(ValueNode::Integer(42)),
Expression::Value(ValueNode::Integer(42)),
2024-02-25 19:26:22 +00:00
)
.run(&Context::new())
.unwrap()
.as_boolean()
.unwrap())
2024-02-25 18:49:26 +00:00
}
}