nx_twinreport.nx source
↩ module page · 54 lines · 3063 B
1// nx_twinreport.nx -- CLI over nx_twinreport_lib (aesthetictwin AT42, 2026-09-17): from a card, or from a seed range, to
2// rendered images plus the board's result rows, in one call. The next nx_compare_results publish shows them.
3// nx_twinreport fit <slug> <target-file> <outdir> <href-prefix> <results-file>
4// nx_twinreport seeds <seed_lo> <seed_hi> <outdir> <href-prefix> <results-file>
5// href-prefix is the site-absolute path of outdir with a trailing slash (/compare/<dom>/results/img/).
6// exit: 0 reported | 2 usage | 3 the target file carries no axis this organ knows | 4 a render refused | 5 the results
7// file refused the append | 6 empty seed range
8// license_tier: ORIGINAL No hw writes (Rule 26).
9import "nx_syscalls.nx"
10import "nx_twinreport_lib.nx"
11
12const TRC_EXIT_USAGE: i64 = 2
13const TRC_ARGC: i64 = 7
14const TRC_A_VERB: i64 = 1
15const TRC_A_ONE: i64 = 2
16const TRC_A_TWO: i64 = 3
17const TRC_A_OUTDIR: i64 = 4
18const TRC_A_HREF: i64 = 5
19const TRC_A_RESULTS: i64 = 6
20
21func trc_usage() -> i64 {
22 ri_puts("usage: nx_twinreport fit <slug> <target-file> <outdir> <href-prefix> <results-file> | seeds <seed_lo> <seed_hi> <outdir> <href-prefix> <results-file>\n" as *u8)
23 return TRC_EXIT_USAGE
24}
25func trc_verdict(code: i64) -> *u8 {
26 if code == TWR_E_NOTARGET { return "REFUSED-NO-TARGET-AXIS" as *u8 }
27 if code == TWR_E_RENDER { return "REFUSED-RENDER" as *u8 }
28 if code == TWR_E_APPEND { return "REFUSED-RESULTS-APPEND" as *u8 }
29 if code == TWR_E_RANGE { return "REFUSED-EMPTY-SEED-RANGE" as *u8 }
30 return "REPORTED" as *u8
31}
32func main(argc: i64, argv: **u8) -> i64 {
33 if argc < TRC_ARGC { return trc_usage() }
34 let base: i64 = sys_mmap(sdf_bytes()) as i64
35 let rep: *i64 = sys_mmap(TWR_R_N * TW_I64) as *i64
36 var code: i64 = 0
37 var known: i64 = 0
38 if ri_streq(argv[TRC_A_VERB], "fit" as *u8) == 1 {
39 known = 1
40 code = twr_fit_report(base, argv[TRC_A_ONE], argv[TRC_A_TWO], argv[TRC_A_OUTDIR], argv[TRC_A_HREF], argv[TRC_A_RESULTS], rep)
41 }
42 if ri_streq(argv[TRC_A_VERB], "seeds" as *u8) == 1 {
43 known = 1
44 code = twr_seed_report(base, tw_atoi(argv[TRC_A_ONE]), tw_atoi(argv[TRC_A_TWO]), argv[TRC_A_OUTDIR], argv[TRC_A_HREF], argv[TRC_A_RESULTS], rep)
45 }
46 if known == 0 { return trc_usage() }
47 ri_puts("TWINREPORT verb=" as *u8); ri_puts(argv[TRC_A_VERB]); ri_puts(" subject=" as *u8); ri_puts(argv[TRC_A_ONE])
48 tw_kv(" evals=" as *u8, rep[TWR_R_EVALS]); tw_kv(" reached=" as *u8, rep[TWR_R_REACHED]); tw_kv(" unreached=" as *u8, rep[TWR_R_UNREACHED])
49 tw_kv(" unstated=" as *u8, rep[TWR_R_UNSTATED]); tw_kv(" surface_confirmed=" as *u8, rep[TWR_R_CONFIRMED]); tw_kv(" renders=" as *u8, rep[TWR_R_RENDERS])
50 tw_kv(" rows_appended=" as *u8, rep[TWR_R_ROWS]); tw_kv(" rows_unchanged=" as *u8, rep[TWR_R_UNCHANGED]); tw_kv(" row_bytes=" as *u8, rep[TWR_R_ROW_BYTES]); tw_kv(" png_bytes=" as *u8, rep[TWR_R_PNG_BYTES])
51 ri_puts(" verdict=" as *u8); ri_puts(trc_verdict(code)); ri_puts("\n" as *u8)
52 if code < 0 { return 0 - code }
53 return 0
54}