use crate::{ast::Expr, csv_source::Row};
pub fn eval(expr: &Expr, row: &Row) -> bool {
match expr {
Expr::Cmp { field, op, value } => cmp(row, field, op, value),
Expr::And(a, b) => eval(a, row) && eval(b, row),
Expr::Or(a, b) => eval(a, row) || eval(b, row),
}
}
fn cmp(row: &Row, field: &str, op: &str, value: &str) -> bool {
let v = match field {
"age" => row.age.map(|x| x.to_string()),
"salary" => row.salary.map(|x| x.to_string()),
"name" => row.name.clone(),
"country" => row.country.clone(),
_ => None,
};
let v = match v { Some(v) => v, None => return false };
match op {
">" => v.parse::<f64>().unwrap_or(0.0) > value.parse().unwrap_or(0.0),
"<" => v.parse::<f64>().unwrap_or(0.0) < value.parse().unwrap_or(0.0),
"=" => v == value,
_ => false,
}
}