wardenclyffe 0.1.1

A tiny Rust query engine that supports SQL-like filters, CSV scanning, projections, and a custom DSL powered by Pest.
Documentation
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,
    }
}