@voxgig/sdkgen 4.8.2 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/action/doctor.d.ts +1 -0
  3. package/dist/action/doctor.js +50 -2
  4. package/dist/action/doctor.js.map +1 -1
  5. package/dist/helpers/naming.js +4 -2
  6. package/dist/helpers/naming.js.map +1 -1
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/model/sdkgen.aon +21 -0
  9. package/package.json +1 -1
  10. package/project/.sdk/model/feature/secrets.aon +120 -18
  11. package/project/.sdk/model/target/c.aon +10 -0
  12. package/project/.sdk/model/target/clojure.aon +13 -0
  13. package/project/.sdk/model/target/cpp.aon +10 -0
  14. package/project/.sdk/model/target/csharp.aon +9 -0
  15. package/project/.sdk/model/target/dart.aon +10 -0
  16. package/project/.sdk/model/target/elixir.aon +9 -0
  17. package/project/.sdk/model/target/go.aon +13 -0
  18. package/project/.sdk/model/target/java.aon +9 -0
  19. package/project/.sdk/model/target/js.aon +7 -0
  20. package/project/.sdk/model/target/kotlin.aon +9 -0
  21. package/project/.sdk/model/target/lean.aon +17 -0
  22. package/project/.sdk/model/target/lua.aon +8 -0
  23. package/project/.sdk/model/target/ocaml.aon +9 -0
  24. package/project/.sdk/model/target/perl.aon +8 -0
  25. package/project/.sdk/model/target/php.aon +8 -0
  26. package/project/.sdk/model/target/py.aon +13 -0
  27. package/project/.sdk/model/target/rb.aon +8 -0
  28. package/project/.sdk/model/target/rust.aon +10 -0
  29. package/project/.sdk/model/target/scala.aon +21 -2
  30. package/project/.sdk/model/target/swift.aon +18 -0
  31. package/project/.sdk/model/target/ts.aon +13 -0
  32. package/project/.sdk/model/target/zig.aon +9 -0
  33. package/project/.sdk/src/cmp/clojure/Package_clojure.ts +9 -2
  34. package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
  35. package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
  36. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
  37. package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
  38. package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
  39. package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
  40. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
  41. package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
  42. package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
  43. package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
  44. package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
  45. package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
  46. package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
  47. package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
  48. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
  49. package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
  50. package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
  51. package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
  52. package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
  53. package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
  54. package/project/.sdk/src/cmp/zig/Package_zig.ts +15 -11
  55. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +3 -3
  56. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +3 -3
  57. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +3 -3
  58. package/project/.sdk/src/cmp/zig/utility_zig.ts +50 -1
  59. package/project/.sdk/tm/c/Makefile +38 -3
  60. package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
  61. package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
  62. package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
  63. package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
  64. package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
  65. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
  66. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
  67. package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
  68. package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
  69. package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
  70. package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
  71. package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
  72. package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
  73. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
  74. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
  75. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
  76. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
  77. package/project/.sdk/tm/cpp/Makefile +5 -1
  78. package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
  79. package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
  80. package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
  81. package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
  82. package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
  83. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
  84. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
  85. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
  86. package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
  87. package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
  88. package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
  89. package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
  90. package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
  91. package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
  92. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
  93. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
  94. package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
  95. package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
  96. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
  97. package/project/.sdk/tm/dart/test/omni.dart +520 -0
  98. package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
  99. package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
  100. package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
  101. package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
  102. package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
  103. package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
  104. package/project/.sdk/tm/elixir/Makefile +11 -3
  105. package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
  106. package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
  107. package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
  108. package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
  109. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
  110. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
  111. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
  112. package/project/.sdk/tm/go/core/context.go +32 -16
  113. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
  114. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
  115. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
  116. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
  117. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
  118. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
  119. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
  120. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
  121. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
  122. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
  123. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
  124. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
  125. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
  126. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
  127. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
  128. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
  129. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
  130. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
  131. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
  132. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
  133. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
  134. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +208 -0
  135. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
  136. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +150 -0
  137. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
  138. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
  139. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
  140. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +442 -0
  141. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +714 -0
  142. package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
  143. package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
  144. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
  145. package/project/.sdk/tm/go/test/omni/omni.go +902 -0
  146. package/project/.sdk/tm/go/test/omni/util.go +381 -0
  147. package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
  148. package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
  149. package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
  150. package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
  151. package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
  152. package/project/.sdk/tm/go/utility/make_options.go +8 -1
  153. package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
  154. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
  155. package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
  156. package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
  157. package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
  158. package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
  159. package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
  160. package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
  161. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
  162. package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
  163. package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
  164. package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
  165. package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
  166. package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
  167. package/project/.sdk/tm/js/test/omni.js +251 -0
  168. package/project/.sdk/tm/js/test/omni.test.js +105 -0
  169. package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
  170. package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
  171. package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
  172. package/project/.sdk/tm/js/test/vendor/omni/runner.js +628 -0
  173. package/project/.sdk/tm/js/test/vendor/omni/util.js +229 -0
  174. package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
  175. package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
  176. package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
  177. package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
  178. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
  179. package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
  180. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
  181. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
  182. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
  183. package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
  184. package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
  185. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
  186. package/project/.sdk/tm/lean/Makefile +12 -5
  187. package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
  188. package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
  189. package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
  190. package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
  191. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
  192. package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
  193. package/project/.sdk/tm/lua/test/omni.lua +456 -0
  194. package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
  195. package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
  196. package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
  197. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
  198. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
  199. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
  200. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
  201. package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
  202. package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
  203. package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
  204. package/project/.sdk/tm/ocaml/Makefile +37 -12
  205. package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
  206. package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
  207. package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
  208. package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
  209. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
  210. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
  211. package/project/.sdk/tm/perl/t/omni.pm +647 -0
  212. package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
  213. package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
  214. package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
  215. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
  216. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
  217. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
  218. package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
  219. package/project/.sdk/tm/php/test/Omni.php +691 -0
  220. package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
  221. package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
  222. package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
  223. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
  224. package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
  225. package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
  226. package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
  227. package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
  228. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
  229. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
  230. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
  231. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
  232. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
  233. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
  234. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
  235. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
  236. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
  237. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
  238. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
  239. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
  240. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
  241. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
  242. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
  243. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +76 -0
  244. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
  245. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
  246. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
  247. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
  248. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
  249. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
  250. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +151 -0
  251. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
  252. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +90 -0
  253. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
  254. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
  255. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
  256. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
  257. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +475 -0
  258. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
  259. package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
  260. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
  261. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
  262. package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
  263. package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
  264. package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
  265. package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
  266. package/project/.sdk/tm/py/test/omni.py +415 -0
  267. package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
  268. package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
  269. package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
  270. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
  271. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +580 -0
  272. package/project/.sdk/tm/py/test/voxgig_omni/util.py +252 -0
  273. package/project/.sdk/tm/rb/test/omni.rb +505 -0
  274. package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
  275. package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
  276. package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
  277. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
  278. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
  279. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
  280. package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
  281. package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
  282. package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
  283. package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
  284. package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
  285. package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
  286. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
  287. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
  288. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
  289. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
  290. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
  291. package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
  292. package/project/.sdk/tm/scala/Makefile +16 -6
  293. package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
  294. package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
  295. package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
  296. package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
  297. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
  298. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
  299. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
  300. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
  301. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
  302. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
  303. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
  304. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
  305. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
  306. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
  307. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
  308. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
  309. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
  310. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
  311. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
  312. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
  313. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
  314. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
  315. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
  316. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
  317. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
  318. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
  319. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
  320. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
  321. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
  322. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
  323. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
  324. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
  325. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
  326. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
  327. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
  328. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
  329. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
  330. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
  331. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
  332. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
  333. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
  334. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
  335. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
  336. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
  337. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
  338. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
  339. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
  340. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
  341. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
  342. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
  343. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
  344. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
  345. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
  346. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
  347. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
  348. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
  349. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
  350. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
  351. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
  352. package/project/.sdk/tm/ts/test/omni.ts +104 -32
  353. package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
  354. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
  355. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
  356. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
  357. package/project/.sdk/tm/zig/Makefile +15 -1
  358. package/project/.sdk/tm/zig/build.zig +23 -5
  359. package/project/.sdk/tm/zig/core/helpers.zig +52 -11
  360. package/project/.sdk/tm/zig/core/mem.zig +17 -1
  361. package/project/.sdk/tm/zig/core/utility.zig +23 -19
  362. package/project/.sdk/tm/zig/feature/audit.zig +2 -2
  363. package/project/.sdk/tm/zig/feature/cache.zig +2 -2
  364. package/project/.sdk/tm/zig/feature/debug.zig +5 -5
  365. package/project/.sdk/tm/zig/feature/netsim.zig +2 -2
  366. package/project/.sdk/tm/zig/feature/paging.zig +2 -2
  367. package/project/.sdk/tm/zig/feature/proxy.zig +15 -8
  368. package/project/.sdk/tm/zig/feature/streaming.zig +5 -5
  369. package/project/.sdk/tm/zig/feature/support.zig +3 -3
  370. package/project/.sdk/tm/zig/feature/telemetry.zig +5 -5
  371. package/project/.sdk/tm/zig/feature/test.zig +10 -5
  372. package/project/.sdk/tm/zig/test/fh.zig +10 -10
  373. package/project/.sdk/tm/zig/test/gotcha_test.zig +5 -5
  374. package/project/.sdk/tm/zig/test/omniresolver.zig +515 -0
  375. package/project/.sdk/tm/zig/test/omnismoke_test.zig +284 -0
  376. package/project/.sdk/tm/zig/test/pipeline_test.zig +8 -8
  377. package/project/.sdk/tm/zig/test/primary_utility_test.zig +145 -155
  378. package/project/.sdk/tm/zig/test/struct_corpus.zig +264 -187
  379. package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +1314 -0
  380. package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +446 -0
  381. package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +7 -4
  382. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +356 -157
  383. package/project/sdkgen-package.json +1 -1
  384. package/src/action/doctor.ts +66 -2
  385. package/src/helpers/naming.ts +4 -2
  386. package/project/.sdk/tm/c/tests/runner.h +0 -274
  387. package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
  388. package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
  389. package/project/.sdk/tm/dart/test/runner.dart +0 -406
  390. package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
  391. package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
  392. package/project/.sdk/tm/go/test/runner_test.go +0 -629
  393. package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
  394. package/project/.sdk/tm/java/test/StructRunner.java +0 -281
  395. package/project/.sdk/tm/js/test/runner.js +0 -387
  396. package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
  397. package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
  398. package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
  399. package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
  400. package/project/.sdk/tm/php/test/StructRunner.php +0 -275
  401. package/project/.sdk/tm/py/test/struct_runner.py +0 -411
  402. package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
  403. package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
  404. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
  405. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
  406. package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
  407. package/project/.sdk/tm/zig/test/struct_runner.zig +0 -464
@@ -1,28 +1,56 @@
1
1
  // Struct utility tests — run the shared `struct` corpus subtree from
2
- // ../.sdk/test/test.json against the vendored voxgig struct port
3
- // (mirrors tm/go/test/struct_utility_test.go).
2
+ // ../.sdk/test/test.json against the vendored voxgig struct port.
3
+ //
4
+ // The corpus is driven by the VENDORED omni runner through the adapter in
5
+ // tests/omni_resolver/mod.rs (which superseded the hand-written
6
+ // tests/struct_runner/mod.rs). Group labels, null flags and subjects are
7
+ // unchanged; the engine underneath them is now the shared one.
4
8
 
5
- mod struct_runner;
9
+ mod omni_resolver;
6
10
 
7
11
  use std::cell::RefCell;
8
12
  use std::rc::Rc;
9
13
 
10
- use struct_runner::*;
14
+ use omni_resolver::*;
11
15
 
12
16
  use RUSTCRATE::utility::voxgigstruct::ordered_map::OrderedMap;
13
17
  use RUSTCRATE::utility::voxgigstruct::value::Value;
14
18
  use RUSTCRATE::utility::voxgigstruct::*;
15
19
 
16
20
 
21
+ /// Groups this SDK's corpus subset does not carry, so a run over it reports
22
+ /// zero checks for them BY DESIGN.
23
+ ///
24
+ /// `Run::report` holds this list to the corpus in both directions: a group
25
+ /// that goes absent without being named here fails the suite, and a name
26
+ /// here that is no longer absent fails it too. Nothing else stops a renamed
27
+ /// or deleted group from taking its whole check count away while `cargo
28
+ /// test` still prints `ok`.
29
+ ///
30
+ /// `sentinels` is the Group A null-unification block (UNDEF_SPEC.md): the
31
+ /// subjects below are wired and ready, and the entries arrive with the
32
+ /// corpus refresh that adds `struct.sentinels`.
33
+ const EXPECTED_SKIPS: &[&str] = &[
34
+ "sentinels-getprop_unify",
35
+ "sentinels-getelem_absent",
36
+ "sentinels-haskey_unify",
37
+ "sentinels-isempty_unify",
38
+ "sentinels-isnode_unify",
39
+ "sentinels-stringify_null",
40
+ ];
41
+
42
+
17
43
  #[test]
18
44
  fn struct_utility() {
19
- let spec = test_json();
20
- let s = vget(&spec, "struct");
21
- let mut run = Run::new();
45
+ let mut run = Run::section("struct");
46
+ // A detached handle on the resolved section, so a `set!` argument does
47
+ // not borrow `run` while `run` is borrowed mutably by the call.
48
+ let s = run.spec.clone();
49
+ let all = run.all.clone();
22
50
 
23
51
  macro_rules! set {
24
52
  ($cat:expr, $name:expr) => {
25
- vget_path(&s, &[$cat, $name])
53
+ jpath(&s, &[$cat, $name])
26
54
  };
27
55
  }
28
56
 
@@ -211,6 +239,28 @@ fn struct_utility() {
211
239
  |v| Value::str(stringify(&v, None, false)),
212
240
  );
213
241
 
242
+ // -------- nullsem (does a PRESENT key holding JSON null read as "no
243
+ // value"?) — the peer of go's `nullsem` subtest and py's test_nullsem.
244
+ // null_flag is false throughout so a stored null survives into the
245
+ // subject rather than being normalised to a sentinel string.
246
+ run.run_set(&set!("nullsem", "getprop"), false, "nullsem-getprop", |vin| {
247
+ let alt = vget(&vin, "alt");
248
+ get_prop(&vget(&vin, "val"), &vget(&vin, "key"), alt)
249
+ });
250
+ run.run_set(&set!("nullsem", "getelem"), false, "nullsem-getelem", |vin| {
251
+ let alt = vget(&vin, "alt");
252
+ get_elem(&vget(&vin, "val"), &vget(&vin, "key"), alt)
253
+ });
254
+ run.run_set(&set!("nullsem", "getpath"), false, "nullsem-getpath", |vin| {
255
+ get_path(&vget(&vin, "store"), &vget(&vin, "path"), None)
256
+ });
257
+ run.run_set(&set!("nullsem", "haskey"), false, "nullsem-haskey", |vin| {
258
+ b(has_key(&vget(&vin, "src"), &vget(&vin, "key")))
259
+ });
260
+ run.run_set(&set!("nullsem", "keysof"), false, "nullsem-keysof", |v| {
261
+ keys_of(&v)
262
+ });
263
+
214
264
  // -------- walk ---------------------------------------------------
215
265
  run.run_set(&set!("walk", "basic"), true, "walk-basic", |vin| {
216
266
  let mut walkpath = |_k: &Value, val: &Value, _p: &Value, path: &[String]| -> Value {
@@ -223,7 +273,7 @@ fn struct_utility() {
223
273
  });
224
274
  // walk.log — three runs (after-only / before-only / both) of a logging callback.
225
275
  {
226
- let log_spec = vget_path(&s, &["walk", "log"]);
276
+ let log_spec = tostruct(&jpath(&s, &["walk", "log"]));
227
277
  let input = clone(&vget(&log_spec, "in"));
228
278
  let want = vget(&log_spec, "out");
229
279
  let mk_log = |inp: &Value, before: bool, after: bool| -> Value {
@@ -377,8 +427,7 @@ fn struct_utility() {
377
427
  });
378
428
  // merge.basic is a single { in, out } object (not a `set`); handle inline.
379
429
  {
380
- let mb = vget(&s, "merge");
381
- let basic = vget(&mb, "basic");
430
+ let basic = tostruct(&jpath(&s, &["merge", "basic"]));
382
431
  let bin = clone(&vget(&basic, "in"));
383
432
  let bout = fix_json(&vget(&basic, "out"), true);
384
433
  let got = fix_json(&merge(&bin, None), true);
@@ -455,7 +504,7 @@ fn struct_utility() {
455
504
  // -------- inject -------------------------------------------------
456
505
  {
457
506
  // inject.basic is a single { in: {val, store}, out } object.
458
- let basic = vget_path(&s, &["inject", "basic"]);
507
+ let basic = tostruct(&jpath(&s, &["inject", "basic"]));
459
508
  let bin = vget(&basic, "in");
460
509
  let bout = fix_json(&vget(&basic, "out"), true);
461
510
  let got = fix_json(
@@ -504,7 +553,7 @@ fn struct_utility() {
504
553
 
505
554
  // -------- transform ---------------------------------------------
506
555
  {
507
- let basic = vget_path(&s, &["transform", "basic"]);
556
+ let basic = tostruct(&jpath(&s, &["transform", "basic"]));
508
557
  let bin = vget(&basic, "in");
509
558
  let bout = fix_json(&vget(&basic, "out"), true);
510
559
  let got = match transform(
@@ -620,7 +669,7 @@ fn struct_utility() {
620
669
  Value::map_of([("zed".to_string(), Value::str(format!("ZED{foo_s}_{bar_s}")))])
621
670
  }
622
671
  {
623
- let check = vget_path(&spec, &["primary", "check"]);
672
+ let check = tostruct(&jpath(&all, &["primary", "check"]));
624
673
  // resolve clients from DEF.client (options are inject()'d against {} — a no-op here)
625
674
  let def_clients = vget_path(&check, &["DEF", "client"]);
626
675
  let mut clients: OrderedMap<Value> = OrderedMap::new();
@@ -657,20 +706,9 @@ fn struct_utility() {
657
706
  }
658
707
 
659
708
  // -------- report -------------------------------------------------
660
- if !run.failures.is_empty() {
661
- let n = run.failures.len();
662
- let mut msg = format!("\n{} corpus check(s) failed ({} passed):\n", n, run.passed);
663
- for f in run.failures.iter().take(60) {
664
- msg.push_str(" - ");
665
- msg.push_str(f);
666
- msg.push('\n');
667
- }
668
- if n > 60 {
669
- msg.push_str(&format!(" ... and {} more\n", n - 60));
670
- }
671
- panic!("{msg}");
672
- }
673
- eprintln!("corpus: {} checks passed", run.passed);
709
+ // Strict: any group that went absent, any expected skip that did not
710
+ // happen, and any corpus group nothing here drives, is a FAILURE.
711
+ run.report("corpus", EXPECTED_SKIPS);
674
712
  }
675
713
 
676
714
  // Function values embedded in data: `get_elem` with a callable `alt`, and
@@ -0,0 +1,412 @@
1
+ // VENDORED: @voxgig/omni sdk-20260907-0029-0 (rust/src/json.rs)
2
+ // Source: https://github.com/voxgig/omni @ 274708cc2d12b21707d975543953f845f8444be0 [tag: sdk-20260907-0029-0]
3
+ // License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ //! The omni JSON value model, with a small in-tree parser.
5
+ //!
6
+ //! The omni runner must be able to test *any* library, and must add no
7
+ //! third-party dependencies, so it carries its own JSON support rather
8
+ //! than borrowing serde or the system under test.
9
+
10
+ use std::collections::BTreeMap;
11
+ use std::fmt;
12
+
13
+ /// A JSON value. `Absent` is the marker for "no value at all", as distinct
14
+ /// from `Null`.
15
+ #[derive(Clone, Debug, PartialEq)]
16
+ pub enum Json {
17
+ Absent,
18
+ Null,
19
+ Bool(bool),
20
+ Num(f64),
21
+ Str(String),
22
+ List(Vec<Json>),
23
+ Map(BTreeMap<String, Json>),
24
+ }
25
+
26
+ impl Json {
27
+ /// A map (JSON object)?
28
+ pub fn ismap(&self) -> bool {
29
+ matches!(self, Json::Map(_))
30
+ }
31
+
32
+ /// A list (JSON array)?
33
+ pub fn islist(&self) -> bool {
34
+ matches!(self, Json::List(_))
35
+ }
36
+
37
+ /// A container (map or list)?
38
+ pub fn isnode(&self) -> bool {
39
+ self.ismap() || self.islist()
40
+ }
41
+
42
+ /// Absent (no value at all)?
43
+ pub fn isabsent(&self) -> bool {
44
+ matches!(self, Json::Absent)
45
+ }
46
+
47
+ /// Null (a JSON null)?
48
+ pub fn isnull(&self) -> bool {
49
+ matches!(self, Json::Null)
50
+ }
51
+
52
+ /// Absent or null?
53
+ pub fn isnone(&self) -> bool {
54
+ self.isabsent() || self.isnull()
55
+ }
56
+
57
+ /// A JSON number? Booleans are not numbers.
58
+ pub fn isnum(&self) -> bool {
59
+ matches!(self, Json::Num(_))
60
+ }
61
+
62
+ pub fn asnum(&self) -> Option<f64> {
63
+ match self {
64
+ Json::Num(num) => Some(*num),
65
+ _ => None,
66
+ }
67
+ }
68
+
69
+ pub fn asstr(&self) -> Option<&str> {
70
+ match self {
71
+ Json::Str(text) => Some(text),
72
+ _ => None,
73
+ }
74
+ }
75
+
76
+ pub fn asmap(&self) -> Option<&BTreeMap<String, Json>> {
77
+ match self {
78
+ Json::Map(map) => Some(map),
79
+ _ => None,
80
+ }
81
+ }
82
+
83
+ pub fn aslist(&self) -> Option<&Vec<Json>> {
84
+ match self {
85
+ Json::List(list) => Some(list),
86
+ _ => None,
87
+ }
88
+ }
89
+
90
+ /// Read a map entry. Returns `Absent` when missing.
91
+ pub fn get(&self, key: &str) -> Json {
92
+ match self {
93
+ Json::Map(map) => map.get(key).cloned().unwrap_or(Json::Absent),
94
+ _ => Json::Absent,
95
+ }
96
+ }
97
+
98
+ /// Is a map key present at all (even with a null value)?
99
+ pub fn has(&self, key: &str) -> bool {
100
+ match self {
101
+ Json::Map(map) => map.contains_key(key),
102
+ _ => false,
103
+ }
104
+ }
105
+
106
+ /// Build a map value.
107
+ pub fn map(entries: Vec<(&str, Json)>) -> Json {
108
+ let mut out = BTreeMap::new();
109
+ for (key, val) in entries {
110
+ out.insert(key.to_string(), val);
111
+ }
112
+ Json::Map(out)
113
+ }
114
+
115
+ /// Build a list value.
116
+ pub fn list(entries: Vec<Json>) -> Json {
117
+ Json::List(entries)
118
+ }
119
+
120
+ /// Build a string value.
121
+ pub fn str(text: &str) -> Json {
122
+ Json::Str(text.to_string())
123
+ }
124
+ }
125
+
126
+ impl fmt::Display for Json {
127
+ fn fmt(&self, out: &mut fmt::Formatter<'_>) -> fmt::Result {
128
+ write!(out, "{}", super::util::jsonstr(self))
129
+ }
130
+ }
131
+
132
+ impl From<f64> for Json {
133
+ fn from(val: f64) -> Json {
134
+ Json::Num(val)
135
+ }
136
+ }
137
+
138
+ impl From<i64> for Json {
139
+ fn from(val: i64) -> Json {
140
+ Json::Num(val as f64)
141
+ }
142
+ }
143
+
144
+ impl From<usize> for Json {
145
+ fn from(val: usize) -> Json {
146
+ Json::Num(val as f64)
147
+ }
148
+ }
149
+
150
+ impl From<bool> for Json {
151
+ fn from(val: bool) -> Json {
152
+ Json::Bool(val)
153
+ }
154
+ }
155
+
156
+ impl From<&str> for Json {
157
+ fn from(val: &str) -> Json {
158
+ Json::Str(val.to_string())
159
+ }
160
+ }
161
+
162
+ impl From<String> for Json {
163
+ fn from(val: String) -> Json {
164
+ Json::Str(val)
165
+ }
166
+ }
167
+
168
+ /// Maximum nesting depth the parser will follow. Omni specs are trusted
169
+ /// input, so this is crash-safety, not a security boundary: past this
170
+ /// depth the recursive parser would overflow the stack and abort the
171
+ /// process, so it returns an error instead. 1024 is far beyond any real
172
+ /// spec, and low enough that reaching the limit itself fits comfortably
173
+ /// in a default (2MiB) test-thread stack even in debug builds.
174
+ const MAX_DEPTH: usize = 1024;
175
+
176
+ /// Parse JSON text into a [`Json`] value.
177
+ pub fn parse(text: &str) -> Result<Json, String> {
178
+ let chars: Vec<char> = text.chars().collect();
179
+ let mut pos = 0usize;
180
+
181
+ skipws(&chars, &mut pos);
182
+ let val = parseval(&chars, &mut pos, 0)?;
183
+ skipws(&chars, &mut pos);
184
+
185
+ if pos < chars.len() {
186
+ return Err(format!("omni: trailing JSON content at {}", pos));
187
+ }
188
+
189
+ Ok(val)
190
+ }
191
+
192
+ fn skipws(chars: &[char], pos: &mut usize) {
193
+ while *pos < chars.len() {
194
+ let char = chars[*pos];
195
+ if char == ' ' || char == '\t' || char == '\n' || char == '\r' {
196
+ *pos += 1;
197
+ } else {
198
+ break;
199
+ }
200
+ }
201
+ }
202
+
203
+ fn parseval(chars: &[char], pos: &mut usize, depth: usize) -> Result<Json, String> {
204
+ if depth > MAX_DEPTH {
205
+ return Err(format!("omni: JSON nested too deeply at {}", pos));
206
+ }
207
+
208
+ if *pos >= chars.len() {
209
+ return Err("omni: unexpected end of JSON".to_string());
210
+ }
211
+
212
+ match chars[*pos] {
213
+ '{' => parsemap(chars, pos, depth),
214
+ '[' => parselist(chars, pos, depth),
215
+ '"' => Ok(Json::Str(parsestr(chars, pos)?)),
216
+ 't' => parseword(chars, pos, "true", Json::Bool(true)),
217
+ 'f' => parseword(chars, pos, "false", Json::Bool(false)),
218
+ 'n' => parseword(chars, pos, "null", Json::Null),
219
+ _ => parsenum(chars, pos),
220
+ }
221
+ }
222
+
223
+ fn parseword(chars: &[char], pos: &mut usize, word: &str, val: Json) -> Result<Json, String> {
224
+ for expect in word.chars() {
225
+ if *pos >= chars.len() || chars[*pos] != expect {
226
+ return Err(format!("omni: bad JSON literal at {}", pos));
227
+ }
228
+ *pos += 1;
229
+ }
230
+ Ok(val)
231
+ }
232
+
233
+ fn parsemap(chars: &[char], pos: &mut usize, depth: usize) -> Result<Json, String> {
234
+ let mut out = BTreeMap::new();
235
+ *pos += 1; // {
236
+
237
+ skipws(chars, pos);
238
+ if *pos < chars.len() && chars[*pos] == '}' {
239
+ *pos += 1;
240
+ return Ok(Json::Map(out));
241
+ }
242
+
243
+ loop {
244
+ skipws(chars, pos);
245
+ let key = parsestr(chars, pos)?;
246
+ skipws(chars, pos);
247
+
248
+ if *pos >= chars.len() || chars[*pos] != ':' {
249
+ return Err(format!("omni: expected ':' at {}", pos));
250
+ }
251
+ *pos += 1;
252
+
253
+ skipws(chars, pos);
254
+ let val = parseval(chars, pos, depth + 1)?;
255
+ out.insert(key, val);
256
+
257
+ skipws(chars, pos);
258
+ if *pos >= chars.len() {
259
+ return Err("omni: unterminated JSON object".to_string());
260
+ }
261
+ if chars[*pos] == ',' {
262
+ *pos += 1;
263
+ continue;
264
+ }
265
+ if chars[*pos] == '}' {
266
+ *pos += 1;
267
+ return Ok(Json::Map(out));
268
+ }
269
+ return Err(format!("omni: expected ',' or '}}' at {}", pos));
270
+ }
271
+ }
272
+
273
+ fn parselist(chars: &[char], pos: &mut usize, depth: usize) -> Result<Json, String> {
274
+ let mut out = Vec::new();
275
+ *pos += 1; // [
276
+
277
+ skipws(chars, pos);
278
+ if *pos < chars.len() && chars[*pos] == ']' {
279
+ *pos += 1;
280
+ return Ok(Json::List(out));
281
+ }
282
+
283
+ loop {
284
+ skipws(chars, pos);
285
+ out.push(parseval(chars, pos, depth + 1)?);
286
+
287
+ skipws(chars, pos);
288
+ if *pos >= chars.len() {
289
+ return Err("omni: unterminated JSON array".to_string());
290
+ }
291
+ if chars[*pos] == ',' {
292
+ *pos += 1;
293
+ continue;
294
+ }
295
+ if chars[*pos] == ']' {
296
+ *pos += 1;
297
+ return Ok(Json::List(out));
298
+ }
299
+ return Err(format!("omni: expected ',' or ']' at {}", pos));
300
+ }
301
+ }
302
+
303
+ fn parsestr(chars: &[char], pos: &mut usize) -> Result<String, String> {
304
+ if *pos >= chars.len() || chars[*pos] != '"' {
305
+ return Err(format!("omni: expected string at {}", pos));
306
+ }
307
+ *pos += 1;
308
+
309
+ let mut out = String::new();
310
+
311
+ while *pos < chars.len() {
312
+ let char = chars[*pos];
313
+ *pos += 1;
314
+
315
+ if char == '"' {
316
+ return Ok(out);
317
+ }
318
+
319
+ if char != '\\' {
320
+ out.push(char);
321
+ continue;
322
+ }
323
+
324
+ if *pos >= chars.len() {
325
+ break;
326
+ }
327
+
328
+ let escape = chars[*pos];
329
+ *pos += 1;
330
+
331
+ match escape {
332
+ '"' => out.push('"'),
333
+ '\\' => out.push('\\'),
334
+ '/' => out.push('/'),
335
+ 'b' => out.push('\u{8}'),
336
+ 'f' => out.push('\u{c}'),
337
+ 'n' => out.push('\n'),
338
+ 'r' => out.push('\r'),
339
+ 't' => out.push('\t'),
340
+ 'u' => {
341
+ let mut code = 0u32;
342
+ for _ in 0..4 {
343
+ if *pos >= chars.len() {
344
+ return Err("omni: bad JSON unicode escape".to_string());
345
+ }
346
+ let digit = chars[*pos]
347
+ .to_digit(16)
348
+ .ok_or_else(|| "omni: bad JSON unicode escape".to_string())?;
349
+ code = code * 16 + digit;
350
+ *pos += 1;
351
+ }
352
+ out.push(char::from_u32(code).unwrap_or('\u{fffd}'));
353
+ }
354
+ _ => return Err(format!("omni: bad JSON escape at {}", pos)),
355
+ }
356
+ }
357
+
358
+ Err("omni: unterminated JSON string".to_string())
359
+ }
360
+
361
+ fn parsenum(chars: &[char], pos: &mut usize) -> Result<Json, String> {
362
+ let start = *pos;
363
+
364
+ if *pos < chars.len() && (chars[*pos] == '-' || chars[*pos] == '+') {
365
+ *pos += 1;
366
+ }
367
+
368
+ while *pos < chars.len() {
369
+ let char = chars[*pos];
370
+ if char.is_ascii_digit()
371
+ || char == '.'
372
+ || char == 'e'
373
+ || char == 'E'
374
+ || char == '-'
375
+ || char == '+'
376
+ {
377
+ *pos += 1;
378
+ } else {
379
+ break;
380
+ }
381
+ }
382
+
383
+ let text: String = chars[start..*pos].iter().collect();
384
+ text.parse::<f64>()
385
+ .map(Json::Num)
386
+ .map_err(|_| format!("omni: bad JSON number [{}] at {}", text, start))
387
+ }
388
+
389
+ #[cfg(test)]
390
+ mod tests {
391
+ use super::*;
392
+
393
+ // Deeply nested input must produce a parse error, not overflow the
394
+ // stack and abort the process.
395
+ #[test]
396
+ fn parse_rejects_deep_nesting() {
397
+ let deep = "[".repeat(MAX_DEPTH * 4);
398
+ let err = parse(&deep).expect_err("deep nesting must be rejected");
399
+ assert!(err.contains("nested too deeply"), "unexpected error: {}", err);
400
+
401
+ let deepmap = "{\"a\":".repeat(MAX_DEPTH * 4);
402
+ let err = parse(&deepmap).expect_err("deep nesting must be rejected");
403
+ assert!(err.contains("nested too deeply"), "unexpected error: {}", err);
404
+ }
405
+
406
+ // Reasonable nesting still parses.
407
+ #[test]
408
+ fn parse_allows_reasonable_nesting() {
409
+ let text = format!("{}1{}", "[".repeat(64), "]".repeat(64));
410
+ assert!(parse(&text).is_ok());
411
+ }
412
+ }
@@ -0,0 +1,38 @@
1
+ // VENDORED: @voxgig/omni sdk-20260907-0029-0 (rust/src/lib.rs)
2
+ // Source: https://github.com/voxgig/omni @ 274708cc2d12b21707d975543953f845f8444be0 [tag: sdk-20260907-0029-0]
3
+ // License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ //! voxgig_omni - the shared multi-language test runner.
5
+ //!
6
+ //! A test spec is plain JSON. The same spec file drives the same tests in
7
+ //! every language that ships an omni port, so behaviour is defined once and
8
+ //! verified everywhere.
9
+ //!
10
+ //! ```no_run
11
+ //! use std::rc::Rc;
12
+ //! use voxgig_omni::{make_runner, Json, Provider, Subject};
13
+ //!
14
+ //! let runner = make_runner("../spec/fib.json", Provider::default()).unwrap();
15
+ //! let pack = runner.runner("fib", None).unwrap();
16
+ //! let double: Subject = Rc::new(|args: &[Json]| {
17
+ //! Ok(Json::Num(args[0].asnum().unwrap_or(0.0) * 2.0))
18
+ //! });
19
+ //! pack.runset(&pack.set("basic"), Some(&double)).unwrap();
20
+ //! ```
21
+
22
+ pub mod json;
23
+ pub mod regex;
24
+ pub mod runner;
25
+ pub mod util;
26
+
27
+ pub use json::{parse, Json};
28
+ pub use regex::Regex;
29
+ pub use runner::{
30
+ errify, fixjson, loadspec, make_runner, matchcheck, matchval, nullmodifier, numtext,
31
+ resolvespec, Flags, OmniError, Provider, RunPack, Runner, SpecRef, Subject, SubjectArgs,
32
+ CAPABILITIES,
33
+ SPECVERSION,
34
+ };
35
+ pub use util::{
36
+ clone, deepequal, getpath, jsonstr, numstr, pathify, stringify, walk, EXISTSMARK, NULLMARK,
37
+ UNDEFMARK,
38
+ };