Skip to main content

execute

Function execute 

Source
pub fn execute(
    core_eval: &[JsonValue],
    initial_payload: JsonValue,
    initial_instruction: JsonValue,
    max_steps: usize,
) -> Result<(Vec<Fact>, JsonValue), CliError>
Expand description

执行规则,产生 Fact 序列

§参数

  • core_eval:transform 规则列表(由 io_util::load_rules 加载)
  • initial_payload:初始 payload
  • initial_instruction:初始指令(通常是 {"type":"noop"} 触发 transform 链)
  • max_steps:最大执行步数上界(先检后 pop)

§返回

(Vec<Fact>, JsonValue):fact 序列(Command、若干 StateTransition、 可选 Error、结尾 Stable)+ 最终 payload(执行器持有,直接返回)

§不变量

  • FIFO 队列:VecDeque::pop_front,不能用 Vec::pop
  • max_steps 先检后 pop:超限发 Error + break
  • I/O 两阶段:IoRequest 时缓存 orig 指令到 pending_io,0.2.0 无 handler 发 Error
Examples found in repository?
examples/programmatic_run.rs (line 48)
20fn main() {
21    println!("🚀 evorule-cli 程序化调用示例\n");
22
23    // 1. 构造一个 set 规则:把 x 设为 42
24    //    (set 是 primitive 业务规则,匹配任何指令)
25    let mut set_params = BTreeMap::new();
26    set_params.insert("attr".to_string(), JsonValue::string("x"));
27    set_params.insert("operation".to_string(), JsonValue::string("set"));
28    set_params.insert("value".to_string(), JsonValue::Integer(42));
29    let mut set_rule = BTreeMap::new();
30    set_rule.insert("type".to_string(), JsonValue::string("set"));
31    set_rule.insert("params".to_string(), JsonValue::object(set_params));
32    let core_eval = vec![JsonValue::object(set_rule)];
33
34    // 2. 初始 payload: { x: 0 }
35    let mut p = BTreeMap::new();
36    p.insert("x".to_string(), JsonValue::Integer(0));
37    let payload = JsonValue::object(p);
38    println!("📦 初始 payload: {payload}");
39
40    // 3. 触发指令:noop(不消耗规则,纯函数测试场景)
41    let mut instr = BTreeMap::new();
42    instr.insert("type".to_string(), JsonValue::string("noop"));
43    let instruction = JsonValue::object(instr);
44
45    // 4. 执行(最多 100 步)
46    //    返回 (fact 序列, 最终 payload)——最终 payload 经返回值直接交付
47    //    (CR-20260901-001:Stable 不再内嵌全量快照)
48    let (facts, final_payload) = match execute(&core_eval, payload, instruction, 100) {
49        Ok(result) => result,
50        Err(e) => {
51            eprintln!("❌ 执行失败: {e:?}");
52            std::process::exit(1);
53        }
54    };
55
56    // 5. 打印 fact log
57    println!("\n📜 生成的 fact log ({} 条):", facts.len());
58    for fact in &facts {
59        println!("  {}", fact_to_human(fact));
60    }
61
62    // 6. 验证最终 payload
63    let x = final_payload.get("x").and_then(|v| v.as_i64());
64    if x == Some(42) {
65        println!("\n✅ 最终 x = 42,符合预期");
66    } else {
67        eprintln!("\n❌ 最终 x = {x:?},期望 42");
68        std::process::exit(1);
69    }
70}