oxide_eval 0.1.2

Oxide Eval is a simple Javascript Evaluator based on oxc.
Documentation
use serde_json::Value;

use crate::util::{vec_to_js_string, OBJ_STR};

use super::util::{number_string, string_number};

pub fn compare<F>(left: &Value, right: &Value, cmp: F) -> bool
where
    F: Fn(&str, &str) -> bool + Copy,
{
    match (left, right) {
        (Value::Number(l), Value::Number(r)) => cmp(
            &l.as_f64().unwrap_or_default().to_string(),
            &r.as_f64().unwrap_or_default().to_string(),
        ),
        (Value::String(l), Value::String(r)) => cmp(l, r),
        (Value::Number(l), Value::String(r)) => {
            number_string(l, r, |l, r| cmp(&l.to_string(), &r.to_string()))
        }
        (Value::String(l), Value::Number(r)) => {
            string_number(l, r, |l, r| cmp(&l.to_string(), &r.to_string()))
        }
        (Value::Array(l), Value::Array(r)) => {
            let l = vec_to_js_string(l);
            let r = vec_to_js_string(r);
            cmp(&l, &r)
        }
        (Value::Array(l), Value::Object(_)) => {
            let l = vec_to_js_string(l);
            cmp(&l, OBJ_STR)
        }
        (Value::Object(_), Value::Array(r)) => {
            let r = vec_to_js_string(r);
            cmp(OBJ_STR, &r)
        }
        _ => false,
    }
}