Skip to main content

basic_guard/
basic_guard.rs

1//! Basic FSM guard evaluation.
2//!
3//! Run with: cargo run --example basic_guard
4
5use fsm_guards::{evaluate, EvalCtx, GuardError};
6use serde_json::json;
7
8fn main() {
9    let ctx = EvalCtx::new();
10
11    // Simple equality check
12    let approved = evaluate(
13        &json!({"==": [{"var": "status"}, "approved"]}),
14        &json!({"status": "approved"}),
15        &ctx,
16    )
17    .unwrap();
18    println!("approved: {approved}"); // true
19
20    // Compound rule
21    let ready = evaluate(
22        &json!({"and": [
23            {"==": [{"var": "status"}, "active"]},
24            {">=": [{"var": "score"}, 80]},
25            {"in": [{"var": "role"}, ["admin", "operator"]]}
26        ]}),
27        &json!({"status": "active", "score": 95, "role": "admin"}),
28        &ctx,
29    )
30    .unwrap();
31    println!("ready: {ready}"); // true
32
33    // Missing variable — detected before evaluation
34    match evaluate(
35        &json!({"var": "nonexistent"}),
36        &json!({"status": "active"}),
37        &ctx,
38    ) {
39        Err(GuardError::MissingVar(path)) => println!("missing var: {path}"),
40        other => println!("unexpected: {other:?}"),
41    }
42}