use datalogic_rs::{Engine, EvaluationConfig, NanHandling, NumericCoercionConfig, TruthyEvaluator};
fn main() {
println!("Engine Configuration Examples\n");
let default_engine = Engine::new();
demonstrate_truthiness("Default (JavaScript)", &default_engine);
let python_engine = Engine::builder()
.with_config(EvaluationConfig::default().with_truthy_evaluator(TruthyEvaluator::Python))
.build();
demonstrate_truthiness("Python", &python_engine);
let strict_engine = Engine::builder()
.with_config(
EvaluationConfig::default().with_truthy_evaluator(TruthyEvaluator::StrictBoolean),
)
.build();
demonstrate_truthiness("Strict Boolean", &strict_engine);
println!("\n=== NaN Handling Examples ===\n");
demonstrate_nan_handling();
println!("\n=== Numeric Coercion Examples ===\n");
demonstrate_numeric_coercion();
}
fn demonstrate_truthiness(name: &str, engine: &Engine) {
println!("=== {} Truthiness ===", name);
let test_values = [
("0", "0"),
("-1", "-1"),
("1", "1"),
(r#""""#, "empty string"),
(r#""text""#, "\"text\""),
("false", "false"),
("null", "null"),
("[]", "[]"),
("[1]", "[1]"),
];
let logic = r#"{"!!": [{"var": "value"}]}"#;
for (value_json, description) in test_values {
let data = format!(r#"{{"value": {}}}"#, value_json);
let result = engine.eval_str(logic, &data).unwrap();
let label = if result == "true" { "truthy" } else { "falsy" };
println!(" {} is {}", description, label);
}
println!();
}
fn demonstrate_nan_handling() {
let logic = r#"{"+": ["hello", 1]}"#;
let data = "{}";
let default_engine = Engine::new();
let result = default_engine.eval_str(logic, data);
println!("Default (ThrowError): {:?}", result);
let ignore_engine = Engine::builder()
.with_config(
EvaluationConfig::default().with_arithmetic_nan_handling(NanHandling::IgnoreValue),
)
.build();
let result = ignore_engine.eval_str(logic, data).unwrap();
println!("IgnoreValue: {} (non-numeric ignored)", result);
let null_engine = Engine::builder()
.with_config(
EvaluationConfig::default().with_arithmetic_nan_handling(NanHandling::ReturnNull),
)
.build();
let result = null_engine.eval_str(logic, data).unwrap();
println!("ReturnNull: {}", result);
let coerce_engine = Engine::builder()
.with_config(
EvaluationConfig::default().with_arithmetic_nan_handling(NanHandling::CoerceToZero),
)
.build();
let result = coerce_engine.eval_str(logic, data).unwrap();
println!("CoerceToZero: {} (\"hello\" treated as 0)", result);
}
fn demonstrate_numeric_coercion() {
let test_cases = [
(r#"{"+": ["", 1]}"#, "\"\" + 1"),
(r#"{"+": [true, 1]}"#, "true + 1"),
(r#"{"+": [null, 5]}"#, "null + 5"),
];
let default_engine = Engine::new();
println!("Default (Coercion Enabled):");
for (logic, desc) in &test_cases {
let result = default_engine.eval_str(*logic, "{}").unwrap();
println!(" {} = {}", desc, result);
}
let strict_engine = Engine::builder()
.with_config(
EvaluationConfig::default()
.with_arithmetic_nan_handling(NanHandling::ReturnNull)
.with_numeric_coercion(
NumericCoercionConfig::default()
.with_empty_string_to_zero(false)
.with_null_to_zero(false)
.with_bool_to_number(false)
.with_reject_non_numeric(true),
),
)
.build();
println!("\nStrict (No Coercion):");
for (logic, desc) in &test_cases {
let result = strict_engine.eval_str(*logic, "{}").unwrap();
println!(" {} = {}", desc, result);
}
}