code wiki / _hdl_build / nx_apistack_schema_gate.nx
nx_apistack_schema_gate.nx source
↩ module page · 40 lines · 2687 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_apistack_schema_gate.nx -- hermetic gate for CAP-API-SCHEMA. Proves required-field validation accepts a
4// complete body, rejects a missing required field, treats optional as optional, and matches at token boundaries
5// (not substrings). expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_apistack_schema.nx"
8
9func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
10" as *u8); return ok }
11func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
12func g_app(buf: *u8, off: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){buf[off+i]=s[i];i=i+1} return off+i }
13
14func main(argc: i64, argv: *i64) -> i64 {
15 gp("=== nx_apistack_schema_gate (machine-readable request validation) ===\n" as *u8)
16 // schema: target REQUIRED, confirm OPTIONAL
17 let sc: *u8 = sys_mmap(256); var scn: i64 = 0
18 scn = g_app(sc, scn, "target" as *u8); sc[scn]=9 as u8; scn=scn+1; sc[scn]=49 as u8; scn=scn+1; sc[scn]=9 as u8; scn=scn+1; scn=g_app(sc, scn, "string" as *u8); sc[scn]=10 as u8; scn=scn+1
19 scn = g_app(sc, scn, "confirm" as *u8); sc[scn]=9 as u8; scn=scn+1; sc[scn]=48 as u8; scn=scn+1; sc[scn]=9 as u8; scn=scn+1; scn=g_app(sc, scn, "string" as *u8); sc[scn]=10 as u8; scn=scn+1
20 var pass: i64 = 0; var fail: i64 = 0
21
22 let b1: *u8 = "target=x&confirm=yes" as *u8
23 if sc_validate(sc, scn, b1, g_slen(b1)) == 1 { pass=pass+1; gp(" T1 complete body -> valid PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL\n" as *u8) }
24
25 let b2: *u8 = "confirm=yes" as *u8
26 if sc_validate(sc, scn, b2, g_slen(b2)) == 0 { pass=pass+1; gp(" T2 missing required 'target' -> invalid PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL accepted\n" as *u8) }
27
28 let b3: *u8 = "target=x" as *u8
29 if sc_validate(sc, scn, b3, g_slen(b3)) == 1 { pass=pass+1; gp(" T3 optional omitted -> still valid PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL\n" as *u8) }
30
31 let b4: *u8 = "a=1&target=x" as *u8
32 if sc_field_present(b4, g_slen(b4), "target" as *u8, 6) == 1 { pass=pass+1; gp(" T4 field found after '&' PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) }
33
34 let b5: *u8 = "mytarget=x" as *u8
35 if sc_field_present(b5, g_slen(b5), "target" as *u8, 6) == 0 { pass=pass+1; gp(" T5 boundary-safe (mytarget != target) PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL substring match\n" as *u8) }
36
37 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
38 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
39 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
40}