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, other: &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, calculation: Calculation) {
match self {
Self::Value(_, calculations) => calculations.push(calculation),
Self::Variable(_, calculations) => calculations.push(calculation),
}
}
}
#[derive(Debug, PartialEq)]
pub struct Comparison {
pub what: ComparisonType,
pub operator: Operator,
pub against: ComparisonType,
}
impl From<(&str, Operator, Value)> for Comparison {
fn from((variable_name, operator, value): (&str, Operator, Value)) -> Self {
Self {
what: ComparisonType::Variable(variable_name.into(), Vec::new()),
operator,
against: ComparisonType::Value(value, Vec::new()),
}
}
}
impl From<(&str, Operator, &str)> for Comparison {
fn from((variable_name, operator, against_variable_name): (&str, Operator, &str)) -> Self {
Self {
what: ComparisonType::Variable(variable_name.into(), Vec::new()),
operator,
against: ComparisonType::Variable(against_variable_name.into(), Vec::new()),
}
}
}