code wiki / (root) / nx_value_parse_json_test.nx

nx_value_parse_json_test.nx source

↩ module page · 148 lines · 7070 B

1// nx_value_parse_json_test.nx -- proves the generic JSON DOM works 2// against REAL upstream data, not hand-coded toy strings. 3// 4// Reads ../nishi-library/fixtures/gbif/solanum_tuberosum.raw (a 450-byte 5// canonical GBIF /v1/species/match response captured 2026-05-17) via 6// sys_read_file, parses to NxValue tree, then walks the tree GENERICALLY 7// via nx_value_object_get_string/_int -- with NO source-specific code. 8// 9// If this PASSes, we have a substrate that can ingest ANY JSON-shaped 10// upstream into a typed tree. 11 12import "syscalls.nx" 13import "nx_value.nx" 14import "nx_value_parse_json.nx" 15 16func make_path_solanum(out: *u8) -> i64 { 17 out[0] = 0x2E; out[1] = 0x2E; out[2] = 0x2F 18 out[3] = 0x2E; out[4] = 0x2E; out[5] = 0x2F 19 out[6] = 0x6E; out[7] = 0x69; out[8] = 0x73; out[9] = 0x68 20 out[10] = 0x69; out[11] = 0x2D; out[12] = 0x6C; out[13] = 0x69 21 out[14] = 0x62; out[15] = 0x72; out[16] = 0x61; out[17] = 0x72 22 out[18] = 0x79; out[19] = 0x2F 23 out[20] = 0x66; out[21] = 0x69; out[22] = 0x78; out[23] = 0x74 24 out[24] = 0x75; out[25] = 0x72; out[26] = 0x65; out[27] = 0x73 25 out[28] = 0x2F 26 out[29] = 0x67; out[30] = 0x62; out[31] = 0x69; out[32] = 0x66 27 out[33] = 0x2F 28 out[34] = 0x73; out[35] = 0x6F; out[36] = 0x6C; out[37] = 0x61 29 out[38] = 0x6E; out[39] = 0x75; out[40] = 0x6D; out[41] = 0x5F 30 out[42] = 0x74; out[43] = 0x75; out[44] = 0x62; out[45] = 0x65 31 out[46] = 0x72; out[47] = 0x6F; out[48] = 0x73; out[49] = 0x75 32 out[50] = 0x6D; out[51] = 0x2E; out[52] = 0x72; out[53] = 0x61 33 out[54] = 0x77; out[55] = 0 34 return 55 35} 36 37func main() -> i64 { 38 // ----- Toy round-trip: parse a hand-built JSON literal -------- 39 // {"a":1,"b":"x","c":[10,20],"d":true,"e":null} 40 let toy: *u8 = sys_mmap(64) 41 toy[0] = 0x7B; toy[1] = 0x22; toy[2] = 0x61; toy[3] = 0x22 // {"a" 42 toy[4] = 0x3A; toy[5] = 0x31; toy[6] = 0x2C // :1, 43 toy[7] = 0x22; toy[8] = 0x62; toy[9] = 0x22; toy[10] = 0x3A // "b": 44 toy[11] = 0x22; toy[12] = 0x78; toy[13] = 0x22; toy[14] = 0x2C // "x", 45 toy[15] = 0x22; toy[16] = 0x63; toy[17] = 0x22; toy[18] = 0x3A // "c": 46 toy[19] = 0x5B; toy[20] = 0x31; toy[21] = 0x30; toy[22] = 0x2C // [10, 47 toy[23] = 0x32; toy[24] = 0x30; toy[25] = 0x5D; toy[26] = 0x2C // 20], 48 toy[27] = 0x22; toy[28] = 0x64; toy[29] = 0x22; toy[30] = 0x3A // "d": 49 toy[31] = 0x74; toy[32] = 0x72; toy[33] = 0x75; toy[34] = 0x65 // true 50 toy[35] = 0x2C // , 51 toy[36] = 0x22; toy[37] = 0x65; toy[38] = 0x22; toy[39] = 0x3A // "e": 52 toy[40] = 0x6E; toy[41] = 0x75; toy[42] = 0x6C; toy[43] = 0x6C // null 53 toy[44] = 0x7D // } 54 55 var v: i64 = 0 56 let root: *NxValue = nx_value_parse_json(toy, 45, &v) 57 if v != NX_VAL_PARSE_OK { return __syscall(93, 1, 0, 0, 0, 0, 0) } 58 if root == 0 as *NxValue { return __syscall(93, 2, 0, 0, 0, 0, 0) } 59 if root.kind != NX_VAL_OBJECT { return __syscall(93, 3, 0, 0, 0, 0, 0) } 60 if root.n_items != 5 { return __syscall(93, 4, 0, 0, 0, 0, 0) } 61 62 // "a" -> int 1 63 let k_a: *u8 = sys_mmap(2); k_a[0] = 0x61 64 var got_a: i64 = 0 65 if nx_value_object_get_int(root, k_a, 1, &got_a) != 1 { return __syscall(93, 5, 0, 0, 0, 0, 0) } 66 if got_a != 1 { return __syscall(93, 6, 0, 0, 0, 0, 0) } 67 68 // "b" -> string "x" 69 let k_b: *u8 = sys_mmap(2); k_b[0] = 0x62 70 var bp: *u8 = 0 as *u8 71 var bl: i64 = 0 72 if nx_value_object_get_string(root, k_b, 1, &bp, &bl) != 1 { return __syscall(93, 7, 0, 0, 0, 0, 0) } 73 if bl != 1 { return __syscall(93, 8, 0, 0, 0, 0, 0) } 74 if bp[0] != 0x78 { return __syscall(93, 9, 0, 0, 0, 0, 0) } 75 76 // "c" -> array [10, 20] 77 let k_c: *u8 = sys_mmap(2); k_c[0] = 0x63 78 let c_node: *NxValue = nx_value_object_get(root, k_c, 1) 79 if c_node == 0 as *NxValue { return __syscall(93, 10, 0, 0, 0, 0, 0) } 80 if c_node.kind != NX_VAL_ARRAY { return __syscall(93, 11, 0, 0, 0, 0, 0) } 81 if nx_value_array_len(c_node) != 2 { return __syscall(93, 12, 0, 0, 0, 0, 0) } 82 let c0: *NxValue = nx_value_array_get(c_node, 0) 83 if c0.int_value != 10 { return __syscall(93, 13, 0, 0, 0, 0, 0) } 84 let c1: *NxValue = nx_value_array_get(c_node, 1) 85 if c1.int_value != 20 { return __syscall(93, 14, 0, 0, 0, 0, 0) } 86 87 // "d" -> bool true 88 let k_d: *u8 = sys_mmap(2); k_d[0] = 0x64 89 let d_node: *NxValue = nx_value_object_get(root, k_d, 1) 90 if d_node.kind != NX_VAL_BOOL { return __syscall(93, 15, 0, 0, 0, 0, 0) } 91 if d_node.int_value != 1 { return __syscall(93, 16, 0, 0, 0, 0, 0) } 92 93 // "e" -> null 94 let k_e: *u8 = sys_mmap(2); k_e[0] = 0x65 95 let e_node: *NxValue = nx_value_object_get(root, k_e, 1) 96 if e_node.kind != NX_VAL_NULL { return __syscall(93, 17, 0, 0, 0, 0, 0) } 97 98 // ----- REAL GBIF fixture round-trip -------------------------- 99 let path: *u8 = sys_mmap(64) 100 make_path_solanum(path) 101 let lenbox: *u8 = sys_mmap(8) 102 let lp: *i64 = lenbox as *i64 103 let bytes: *u8 = sys_read_file(path, lp) 104 if bytes == 0 as *u8 { return __syscall(93, 20, 0, 0, 0, 0, 0) } 105 106 var v2: i64 = 0 107 let gbif_root: *NxValue = nx_value_parse_json(bytes, *lp, &v2) 108 if v2 != NX_VAL_PARSE_OK { return __syscall(93, 21, 0, 0, 0, 0, 0) } 109 if gbif_root.kind != NX_VAL_OBJECT { return __syscall(93, 22, 0, 0, 0, 0, 0) } 110 // GBIF species/match response has many keys; ensure at least 10 111 if gbif_root.n_items < 10 { return __syscall(93, 23, 0, 0, 0, 0, 0) } 112 113 // Get canonicalName 114 let kn_cn: *u8 = sys_mmap(16) 115 kn_cn[0] = 0x63; kn_cn[1] = 0x61; kn_cn[2] = 0x6E; kn_cn[3] = 0x6F 116 kn_cn[4] = 0x6E; kn_cn[5] = 0x69; kn_cn[6] = 0x63; kn_cn[7] = 0x61 117 kn_cn[8] = 0x6C; kn_cn[9] = 0x4E; kn_cn[10] = 0x61; kn_cn[11] = 0x6D 118 kn_cn[12] = 0x65 // "canonicalName" 119 var cnp: *u8 = 0 as *u8 120 var cnl: i64 = 0 121 if nx_value_object_get_string(gbif_root, kn_cn, 13, &cnp, &cnl) != 1 { 122 return __syscall(93, 24, 0, 0, 0, 0, 0) 123 } 124 if cnl != 17 { return __syscall(93, 25, 0, 0, 0, 0, 0) } // "Solanum tuberosum" 125 126 // Get usageKey 127 let kn_uk: *u8 = sys_mmap(16) 128 kn_uk[0] = 0x75; kn_uk[1] = 0x73; kn_uk[2] = 0x61; kn_uk[3] = 0x67 129 kn_uk[4] = 0x65; kn_uk[5] = 0x4B; kn_uk[6] = 0x65; kn_uk[7] = 0x79 130 var uk: i64 = 0 131 if nx_value_object_get_int(gbif_root, kn_uk, 8, &uk) != 1 { 132 return __syscall(93, 26, 0, 0, 0, 0, 0) 133 } 134 if uk != 2930262 { return __syscall(93, 27, 0, 0, 0, 0, 0) } 135 136 // Get kingdom 137 let kn_kg: *u8 = sys_mmap(16) 138 kn_kg[0] = 0x6B; kn_kg[1] = 0x69; kn_kg[2] = 0x6E; kn_kg[3] = 0x67 139 kn_kg[4] = 0x64; kn_kg[5] = 0x6F; kn_kg[6] = 0x6D 140 var kgp: *u8 = 0 as *u8 141 var kgl: i64 = 0 142 if nx_value_object_get_string(gbif_root, kn_kg, 7, &kgp, &kgl) != 1 { 143 return __syscall(93, 28, 0, 0, 0, 0, 0) 144 } 145 if kgl != 7 { return __syscall(93, 29, 0, 0, 0, 0, 0) } // "Plantae" 146 147 return 0 148}