code wiki / _hdl_build / nx_wflow_data_gate.nx
nx_wflow_data_gate.nx source
↩ module page · 120 lines · 5356 B
1// nx_wflow_data_gate.nx -- R8 DATA-PASSING gate: run-scoped variables on the event-sourced ledger.
2// Trigger-event fields auto-bind as vars (WFVAR records) -> {key} placeholders substitute into ANY step
3// arg at execution -> set-var writes DERIVED vars (its own arg substitutes first) -> LAST write wins ->
4// unknown or unclosed placeholder = LOUD step failure, run FAILED (the send_merge law) -> vars reach a
5// FORKED organ argv (argecho receives the event's values). ONE fork. license_tier: ORIGINAL expect_exit: 0
6import "nx_wflow_engine.nx"
7
8func dg_n(led: *u8, ridtok: *u8, st: *u8) -> i64 {
9 let szp: *i64 = sys_mmap(8) as *i64
10 let b: *u8 = wf_readall(led, szp)
11 if (b as i64) == 0 { return 0 - 1 }
12 return wf_lines_with2(b, szp[0], ridtok, st)
13}
14func dg_row(conf: *u8, name: *u8, elf: *u8, flag: *u8) -> i64 {
15 let ln: *u8 = sys_mmap(600)
16 var o: i64 = 0
17 o = wf_cat(ln, o, name)
18 ln[o] = 9 as u8
19 o = o + 1
20 o = wf_cat(ln, o, elf)
21 ln[o] = 9 as u8
22 o = o + 1
23 o = wf_cat(ln, o, flag)
24 ln[o] = 10 as u8
25 ln[o+1] = 0 as u8
26 return wf_append(conf, ln)
27}
28
29func main() -> i64 {
30 p("=== NX-WFLOW-DATA GATE (R8: event data -> variables -> any step arg, incl forked organ argv) ===\n" as *u8)
31 var ok: i64 = 1
32 let now: i64 = wf_now()
33 let led: *u8 = sys_mmap(128)
34 var lo: i64 = 0
35 lo = wf_cat(led, lo, "/tmp/wfdata_" as *u8)
36 lo = wf_catn(led, lo, now)
37 lo = wf_cat(led, lo, ".log" as *u8)
38 led[lo] = 0 as u8
39 let conf: *u8 = sys_mmap(128)
40 var co: i64 = 0
41 co = wf_cat(conf, co, "/tmp/wfdata_" as *u8)
42 co = wf_catn(conf, co, now)
43 co = wf_cat(conf, co, ".conf" as *u8)
44 conf[co] = 0 as u8
45 dg_row(conf, "argecho" as *u8, "./_offc/nx_tool_argecho.elf" as *u8, "GREEN" as *u8)
46
47 let flows: *i64 = sys_mmap(8 * 8) as *i64
48 flows[0] = "fd1|deal-won|-" as *u8 as i64
49 flows[1] = "fd2|bad-sub|-" as *u8 as i64
50 flows[2] = "fd3|override|-" as *u8 as i64
51 flows[3] = "fd4|unclosed|-" as *u8 as i64
52 let steps: *i64 = sys_mmap(8 * 12) as *i64
53 steps[0] = "fd1|1|set-var|-|greet=Congrats {name}|1" as *u8 as i64
54 steps[1] = "fd1|2|notify|-|{greet} on {deal}|1" as *u8 as i64
55 steps[2] = "fd1|3|exec-organ|argecho|{name}~{deal}|1" as *u8 as i64
56 steps[3] = "fd2|1|notify|-|hello {missing}|1" as *u8 as i64
57 steps[4] = "fd3|1|set-var|-|name=Override|1" as *u8 as i64
58 steps[5] = "fd3|2|set-var|-|msg={name}|1" as *u8 as i64
59 steps[6] = "fd4|1|notify|-|broken {oops|1" as *u8 as i64
60 let cx: *i64 = sys_mmap(32) as *i64
61 cx[0] = steps as i64
62 cx[1] = 7
63 cx[2] = led as i64
64 cx[3] = conf as i64
65
66 // T0 load: 7 rows ok; set-var without key=value refused
67 let l0: i64 = wf_load(steps, 7)
68 let bad: *i64 = sys_mmap(16) as *i64
69 bad[0] = "f9|1|set-var|-|novalue|1" as *u8 as i64
70 let lb: i64 = wf_load(bad, 1)
71 p(" T0 load=" as *u8); pn(l0); p(" badSetvar=" as *u8); pn(lb); p("\n" as *u8)
72 if l0 != 7 { ok = 0 }
73 if lb != (0 - 1) { ok = 0 }
74
75 // T1 the dataflow: event fields bind -> derived set-var substitutes -> notify uses both -> vars reach argecho argv
76 let r1: i64 = wf_fire(cx, flows, 4, "deal-won~name=Rose~deal=Riverside~id=V1" as *u8)
77 let d1: i64 = dg_n(led, " rid=V1.fd1 " as *u8, "status=DONE" as *u8)
78 let o1: i64 = dg_n(led, " rid=V1.fd1 " as *u8, "status=OK" as *u8)
79 let vb: i64 = dg_n(led, " rid=V1.fd1 " as *u8, "k=name v=Rose" as *u8)
80 let vg: i64 = dg_n(led, " rid=V1.fd1 " as *u8, "v=Congrats Rose" as *u8)
81 p(" T1 flow started=" as *u8); pn(r1); p(" done=" as *u8); pn(d1); p(" okSteps=" as *u8); pn(o1)
82 p(" eventBound=" as *u8); pn(vb); p(" derivedVar=" as *u8); pn(vg); p("\n" as *u8)
83 if r1 != 1 { ok = 0 }
84 if d1 != 1 { ok = 0 }
85 if o1 != 3 { ok = 0 }
86 if vb != 1 { ok = 0 }
87 if vg != 1 { ok = 0 }
88
89 // T2 unknown variable -> LOUD step failure, run FAILED, nothing fabricated
90 wf_fire(cx, flows, 4, "bad-sub~id=V2" as *u8)
91 let f2: i64 = dg_n(led, " rid=V2.fd2 " as *u8, "status=FAILED" as *u8)
92 let d2: i64 = dg_n(led, " rid=V2.fd2 " as *u8, "status=DONE" as *u8)
93 p(" T2 unknownVar failed=" as *u8); pn(f2); p(" done=" as *u8); pn(d2); p("\n" as *u8)
94 if f2 != 1 { ok = 0 }
95 if d2 != 0 { ok = 0 }
96
97 // T3 LAST WRITE WINS: set-var name=Override beats the event's name=Rose for later steps
98 wf_fire(cx, flows, 4, "override~name=Rose~id=V3" as *u8)
99 let d3: i64 = dg_n(led, " rid=V3.fd3 " as *u8, "status=DONE" as *u8)
100 let vo: i64 = dg_n(led, " rid=V3.fd3 " as *u8, "k=msg v=Override" as *u8)
101 p(" T3 override done=" as *u8); pn(d3); p(" msgIsOverride=" as *u8); pn(vo); p("\n" as *u8)
102 if d3 != 1 { ok = 0 }
103 if vo != 1 { ok = 0 }
104
105 // T4 unclosed placeholder -> LOUD failure
106 wf_fire(cx, flows, 4, "unclosed~id=V4" as *u8)
107 let f4: i64 = dg_n(led, " rid=V4.fd4 " as *u8, "status=FAILED" as *u8)
108 p(" T4 unclosed failed=" as *u8); pn(f4); p("\n" as *u8)
109 if f4 != 1 { ok = 0 }
110
111 // T5 negctl: nonsense value never appears
112 let ban: i64 = dg_n(led, "WFVAR" as *u8, "v=BANANA" as *u8)
113 p(" T5 negctl nonsense=" as *u8); pn(ban); p("\n" as *u8)
114 if ban != 0 { ok = 0 }
115
116 p("NX-WFLOW-DATA-GATE ledger=" as *u8); p(led); p(" forks=1 " as *u8)
117 if ok == 1 { p("verdict=GREEN\n" as *u8); return 0 }
118 p("verdict=RED\n" as *u8)
119 return 1
120}