expr-lang 2.0.0

Implementation of expr language in Rust
Documentation
use expr::{Context, Value, compile, run};
use indexmap::IndexMap;
use std::hint::black_box;

fn main() {
    match std::env::args().nth(1).as_deref() {
        Some("startup") => {}
        Some("context") => context(),
        Some("predicate") => predicate(),
        Some("regex") => regex(),
        Some("json") => json(),
        scenario => panic!("unknown benchmark scenario: {scenario:?}"),
    }
}

fn context() {
    let ctx = Context::from_iter((0..10_000).map(|i| (format!("key_{i}"), i)));
    let program = compile("key_9999 + 1").unwrap();
    for _ in 0..100 {
        black_box(run(black_box(&program), black_box(&ctx)).unwrap());
    }
}

fn predicate() {
    let items = (0..500).map(Value::Integer).collect::<Vec<_>>();
    let ctx = Context::from_iter([("items", Value::Array(items))]);
    let program = compile("map(items, {# + 1})").unwrap();
    for _ in 0..10 {
        black_box(run(black_box(&program), black_box(&ctx)).unwrap());
    }
}

fn regex() {
    let ctx = Context::default();
    let program =
        compile(r#""release-2.0.0" matches "^release-[0-9]+\\.[0-9]+\\.[0-9]+$""#).unwrap();
    for _ in 0..10_000 {
        black_box(run(black_box(&program), black_box(&ctx)).unwrap());
    }
}

fn json() {
    let payload = (0..1_000)
        .map(|i| (format!("key_{i}"), Value::Integer(i)))
        .collect::<IndexMap<_, _>>();
    let ctx = Context::from_iter([("payload", Value::Map(payload))]);
    let program = compile("toJSON(payload)").unwrap();
    for _ in 0..100 {
        black_box(run(black_box(&program), black_box(&ctx)).unwrap());
    }
}