fuel_limits/
fuel_limits.rs1use fsm_guards::{evaluate, EvalCtx, GuardError};
6use serde_json::json;
7
8fn main() {
9 let mut deep = json!({"==": [1, 2]});
12 for _ in 0..50 {
13 deep = json!({"and": [deep, {"==": [1, 2]}]});
14 }
15 let rule = json!({"or": [true, deep]});
16
17 let ctx = EvalCtx::new().with_fuel(5);
18 let result = evaluate(&rule, &json!({}), &ctx).unwrap();
19 println!("short-circuit or: {result}"); let rule = json!({"and": [
23 {"==": [1, 1]},
24 {"==": [2, 2]},
25 {"==": [3, 3]}
26 ]});
27
28 match evaluate(&rule, &json!({}), &EvalCtx::new().with_fuel(5)) {
29 Ok(v) => println!("passed with fuel:5 → {v}"),
30 Err(GuardError::FuelExceeded { limit }) => println!("exceeded limit:{limit}"),
31 Err(e) => println!("error: {e}"),
32 }
33
34 let ctx = EvalCtx::new(); let rule = json!({"and": [
37 {"==": [{"var": "status"}, "active"]},
38 {">=": [{"var": "score"}, 80]},
39 {"in": [{"var": "role"}, ["admin", "operator"]]}
40 ]});
41 let data = json!({"status": "active", "score": 95, "role": "admin"});
42 println!("realistic guard: {}", evaluate(&rule, &data, &ctx).unwrap()); }