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