use crate::{value::Value, Calculation};
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Logic {
And,
Or,
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum Operator {
Equal, NotEqual, GreaterEqual, LessEqual, Greater, Less, }
pub trait Compareable {
fn compare(&self, rhs: &Self, operator: Operator) -> bool;
}
#[derive(Debug, PartialEq)]
pub enum ComparisonType {
Value(Value, Vec<Calculation>),
Variable(String, Vec<Calculation>),
}
impl ComparisonType {
pub fn with_calculation(&mut self, calc: Calculation) {
match self {
Self::Value(_, calcs) => calcs.push(calc),
Self::Variable(_, calcs) => calcs.push(calc),
}
}
}
#[derive(Debug, PartialEq)]
pub struct Comparison {
pub lhs: ComparisonType,
pub operator: Operator,
pub rhs: ComparisonType,
}
impl From<(&str, Operator, Value)> for Comparison {
fn from((name, operator, value): (&str, Operator, Value)) -> Self {
Self {
lhs: ComparisonType::Variable(name.into(), Vec::new()),
operator,
rhs: ComparisonType::Value(value, Vec::new()),
}
}
}
impl From<(&str, Operator, &str)> for Comparison {
fn from((name, operator, rhs): (&str, Operator, &str)) -> Self {
Self {
lhs: ComparisonType::Variable(name.into(), Vec::new()),
operator,
rhs: ComparisonType::Variable(rhs.into(), Vec::new()),
}
}
}