@voxgig/sdkgen 4.10.0 → 4.11.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.
- package/bin/voxgig-sdkgen +1 -1
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +330 -0
- package/project/.sdk/model/target/c.aon +15 -2
- package/project/.sdk/model/target/cpp.aon +18 -0
- package/project/.sdk/model/target/lua.aon +17 -0
- package/project/.sdk/model/target/ocaml.aon +48 -5
- package/project/.sdk/model/target/zig.aon +30 -4
- package/project/.sdk/src/cmp/c/Config_c.ts +338 -1
- package/project/.sdk/src/cmp/c/Main_c.ts +57 -2
- package/project/.sdk/src/cmp/c/Package_c.ts +12 -2
- package/project/.sdk/src/cmp/cpp/Config_cpp.ts +324 -2
- package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +2 -0
- package/project/.sdk/src/cmp/cpp/Main_cpp.ts +62 -4
- package/project/.sdk/src/cmp/cpp/Package_cpp.ts +10 -0
- package/project/.sdk/src/cmp/lua/Config_lua.ts +88 -0
- package/project/.sdk/src/cmp/lua/Gitignore_lua.ts +4 -0
- package/project/.sdk/src/cmp/lua/Main_lua.ts +93 -3
- package/project/.sdk/src/cmp/lua/Package_lua.ts +60 -0
- package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +10 -0
- package/project/.sdk/src/cmp/ocaml/Config_ocaml.ts +183 -5
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +160 -3
- package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +25 -1
- package/project/.sdk/src/cmp/zig/Config_zig.ts +130 -9
- package/project/.sdk/src/cmp/zig/Main_zig.ts +208 -4
- package/project/.sdk/{tm/zig/build.zig → src/cmp/zig/fragment/Build.fragment.zig} +7 -0
- package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +25 -0
- package/project/.sdk/{tm/zig/root.zig → src/cmp/zig/fragment/Root.fragment.zig} +9 -0
- package/project/.sdk/tm/c/Makefile +58 -9
- package/project/.sdk/tm/c/core/sdk.h +10 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.c +133 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.h +39 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.c +83 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.h +48 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.c +413 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.h +24 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.c +264 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.h +29 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.c +220 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.c +97 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.c +237 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.h +17 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.c +1494 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.c +288 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.h +80 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.c +170 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.h +52 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.c +98 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.c +150 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.h +104 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.c +649 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.c +151 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.h +34 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/aws.c +281 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/azuresecrets.c +207 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/boru.c +164 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/clock.c +75 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/doppler.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/encode.c +144 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/gcpsecrets.c +177 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/hashicorp.c +239 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/httpjson.c +599 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/infisical.c +165 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/onepassword.c +194 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/proc.c +233 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/secretspec.c +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sekretoplugins.h +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sha256.c +270 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sigv4.c +382 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/support.h +153 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/tls.c +420 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/internal.h +86 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/json.c +721 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/providers.c +813 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.c +944 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.h +490 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/util.c +442 -0
- package/project/.sdk/tm/c/feature/secrets.c +797 -0
- package/project/.sdk/tm/c/feature/secrets.h +46 -0
- package/project/.sdk/tm/c/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/c/tests/feature/secrets/secrets_test.c +802 -0
- package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +38 -11
- package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +40 -6
- package/project/.sdk/tm/cpp/Makefile +48 -4
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.hpp +41 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.cpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.hpp +66 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.cpp +376 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.hpp +29 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.cpp +230 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.hpp +31 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.cpp +205 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.cpp +84 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.hpp +24 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.cpp +222 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.hpp +21 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.cpp +1200 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.hpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.cpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.hpp +22 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.cpp +110 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.hpp +79 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.cpp +136 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.hpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.cpp +82 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.cpp +90 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.hpp +65 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.cpp +491 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.hpp +120 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.cpp +143 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.hpp +36 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.cpp +248 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.hpp +30 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.cpp +149 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.cpp +117 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.cpp +180 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.hpp +52 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.cpp +87 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.cpp +153 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.cpp +666 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.hpp +160 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.cpp +123 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.cpp +125 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.cpp +223 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.cpp +104 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.cpp +242 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.hpp +58 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.cpp +260 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.cpp +476 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.hpp +89 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.cpp +312 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.hpp +263 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.cpp +354 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.hpp +111 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.cpp +613 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.hpp +227 -0
- package/project/.sdk/tm/cpp/feature/secrets.hpp +745 -0
- package/project/.sdk/tm/cpp/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/cpp/test/feature/secrets/secrets_test.cpp +808 -0
- package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +34 -8
- package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +85 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +17 -2
- package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +41 -0
- package/project/.sdk/tm/go/feature/secrets_feature.go +32 -10
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +116 -0
- package/project/.sdk/tm/java/feature/SecretsFeature.java +33 -8
- package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +64 -0
- package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +34 -11
- package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +73 -0
- package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +32 -7
- package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +69 -0
- package/project/.sdk/tm/lua/Makefile +15 -4
- package/project/.sdk/tm/lua/feature/secrets/native/sekretonet.c +806 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/capability.lua +135 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/catalog.lua +63 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/config.lua +361 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/depend.lua +232 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/env.lua +168 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/export.lua +66 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/graph.lua +194 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/host.lua +1190 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/json.lua +169 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/order.lua +207 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/point.lua +106 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/ref.lua +115 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/resolve.lua +78 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/types.lua +275 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/version.lua +131 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin.lua +76 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/addr.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/err.lua +47 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/name.lua +315 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/aws.lua +228 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/azuresecrets.lua +137 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/boru.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/crypto.lua +212 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/doppler.lua +89 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/gcpsecrets.lua +129 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/hashicorp.lua +154 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/httpjson.lua +248 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/infisical.lua +113 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/json.lua +449 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/net.lua +198 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/onepassword.lua +126 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/secretspec.lua +93 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/sigv4.lua +269 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/support.lua +146 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/providers.lua +346 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto.lua +479 -0
- package/project/.sdk/tm/lua/feature/secrets_feature.lua +690 -0
- package/project/.sdk/tm/lua/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/lua/test/extend_test.lua +105 -0
- package/project/.sdk/tm/lua/test/feature/secrets/secrets_feature_test.lua +862 -0
- package/project/.sdk/tm/ocaml/Makefile +52 -8
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/capability.ml +106 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/catalog.ml +43 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/config.ml +349 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/defs.ml +143 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/depend.ml +217 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/env.ml +197 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/export.ml +89 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/graph.ml +227 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/host.ml +1112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/order.ml +202 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/point.ml +138 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/ref.ml +126 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/resolve.ml +62 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/types.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/value.ml +387 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/version.ml +139 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/aws.ml +171 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/azuresecrets.ml +116 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/boru.ml +95 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/crypto.ml +149 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/doppler.ml +61 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/gcpsecrets.ml +93 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/hashicorp.ml +120 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/http.ml +421 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/httpjson.ml +66 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/infisical.ml +85 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/onepassword.ml +112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/runcmd.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/secretspec.ml +68 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/sigv4.ml +259 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls.ml +44 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls_stubs.c +358 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/json.ml +376 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/provider.ml +647 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/secret.ml +299 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/sekreto.ml +347 -0
- package/project/.sdk/tm/ocaml/feature/secrets_feature.ml +453 -0
- package/project/.sdk/tm/ocaml/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +670 -0
- package/project/.sdk/tm/perl/feature/secrets_feature.pm +33 -12
- package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +47 -0
- package/project/.sdk/tm/php/feature/SecretsFeature.php +30 -6
- package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +98 -0
- package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +28 -6
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +114 -0
- package/project/.sdk/tm/rb/feature/secrets_feature.rb +28 -6
- package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +93 -0
- package/project/.sdk/tm/rust/feature/secrets.rs +33 -10
- package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +96 -0
- package/project/.sdk/tm/scala/feature/SecretsFeature.scala +29 -7
- package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +71 -0
- package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +35 -12
- package/project/.sdk/tm/ts/test/feature/secrets/Secrets.test.ts +73 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/capability.zig +137 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/catalog.zig +90 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/config.zig +346 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/depend.zig +244 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/env.zig +201 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/export.zig +83 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/graph.zig +212 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/host.zig +1224 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/inst.zig +126 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/order.zig +228 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/plugin.zig +34 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/point.zig +166 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/ref.zig +147 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/resolve.zig +74 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/types.zig +140 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/value.zig +662 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/version.zig +139 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/aws.zig +294 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/azuresecrets.zig +222 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/boru.zig +188 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/doppler.zig +135 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/gcpsecrets.zig +170 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/hashicorp.zig +242 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/httpjson.zig +535 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/infisical.zig +167 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/onepassword.zig +202 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/secretspec.zig +160 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/sigv4.zig +336 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/addr.zig +148 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/builtins.zig +259 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/provider.zig +440 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/sekreto.zig +944 -0
- package/project/.sdk/tm/zig/feature/secrets.zig +854 -0
- package/project/.sdk/tm/zig/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/zig/test/feature/secrets/secrets_test.zig +891 -0
- package/project/sdkgen-package.json +1 -1
|
@@ -0,0 +1,662 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin sdk-20260908-1556-0 (zig/src/value.zig)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 48392f5e2b6d1434ee9b1a4a9a11f4480aaeb46a [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
//! The dynamic value, and the JSON reader that fills it (§16).
|
|
5
|
+
//!
|
|
6
|
+
//! HAND-WRITTEN, THOUGH `std.json` EXISTS. That is a choice, not a
|
|
7
|
+
//! constraint: zig's `std.json` is the standard library, so §16 would
|
|
8
|
+
//! permit it, and its `ObjectMap` even preserves insertion order. The
|
|
9
|
+
//! reason to write the reader here is symmetry — `c`, `cpp`, `ocaml`
|
|
10
|
+
//! and `haskell` all carry the same 200-line reader, the corpus is the
|
|
11
|
+
//! only thing it ever reads, and a port whose value type is its own is
|
|
12
|
+
//! a port whose ordering rules are visible in one place.
|
|
13
|
+
//!
|
|
14
|
+
//! ARENA ALLOCATION, for the reason `c` gives: every Value lives in one
|
|
15
|
+
//! arena and the whole arena is freed at once. Nothing frees an
|
|
16
|
+
//! individual value, so nothing can double-free one. Zig hands the
|
|
17
|
+
//! arena over in the standard library rather than making the port build
|
|
18
|
+
//! it.
|
|
19
|
+
|
|
20
|
+
const std = @import("std");
|
|
21
|
+
const builtin = @import("builtin");
|
|
22
|
+
|
|
23
|
+
/// TWO TOOLCHAINS, ONE SOURCE. This port's own CI builds it on zig 0.13,
|
|
24
|
+
/// and its first consumer (voxgig/sekreto) builds it on zig 0.16, and
|
|
25
|
+
/// the two standard libraries disagree in exactly three places: the
|
|
26
|
+
/// managed list, file I/O, and the environment. `modern` is the one
|
|
27
|
+
/// switch, and every difference is a comptime branch on it, so the
|
|
28
|
+
/// untaken branch is never analysed against a standard library that
|
|
29
|
+
/// lacks it.
|
|
30
|
+
pub const modern = builtin.zig_version.major > 0 or builtin.zig_version.minor >= 15;
|
|
31
|
+
|
|
32
|
+
/// The list whose allocator travels with it. Zig 0.15 made
|
|
33
|
+
/// `std.ArrayList` unmanaged and moved the managed one to
|
|
34
|
+
/// `std.array_list.Managed`; the API is the same on both sides of the
|
|
35
|
+
/// move, so this alias is the whole of the difference.
|
|
36
|
+
pub fn List(comptime T: type) type {
|
|
37
|
+
return if (modern) std.array_list.Managed(T) else std.ArrayList(T);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
pub const Kind = enum { nul, boolean, num, str, list, map };
|
|
41
|
+
|
|
42
|
+
pub const Entry = struct {
|
|
43
|
+
key: []const u8,
|
|
44
|
+
val: *Value,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
pub const Value = struct {
|
|
48
|
+
kind: Kind = .nul,
|
|
49
|
+
boolean: bool = false,
|
|
50
|
+
num: f64 = 0,
|
|
51
|
+
str: []const u8 = "",
|
|
52
|
+
/// A list preserves order because it IS the order.
|
|
53
|
+
items: List(*Value) = undefined,
|
|
54
|
+
/// A MAP PRESERVES INSERTION ORDER AND SORTS ON DEMAND. §4 rule 4
|
|
55
|
+
/// makes order observable in several places (`keys` is sorted, `pos`
|
|
56
|
+
/// is the sorted-ref index), so both orders have to be available and
|
|
57
|
+
/// the code has to say which it means at each use. An ArrayList of
|
|
58
|
+
/// entries rather than a hash map: these maps hold a handful of keys.
|
|
59
|
+
entries: List(Entry) = undefined,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// --- the arena --------------------------------------------------------
|
|
63
|
+
|
|
64
|
+
var arena_state: ?std.heap.ArenaAllocator = null;
|
|
65
|
+
|
|
66
|
+
pub fn arena() std.mem.Allocator {
|
|
67
|
+
if (arena_state == null) {
|
|
68
|
+
arena_state = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
69
|
+
}
|
|
70
|
+
return arena_state.?.allocator();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// Free EVERYTHING. Call between corpus entries, never inside one.
|
|
74
|
+
pub fn arenaReset() void {
|
|
75
|
+
if (arena_state) |*a| {
|
|
76
|
+
_ = a.reset(.free_all);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// Allocation failure is fatal: a library that limps on after it cannot
|
|
81
|
+
/// be reasoned about and the corpus cannot express it.
|
|
82
|
+
fn alloc(comptime T: type, n: usize) []T {
|
|
83
|
+
return arena().alloc(T, n) catch @panic("plugin: out of memory");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
pub fn dupe(s: []const u8) []const u8 {
|
|
87
|
+
const out = alloc(u8, s.len);
|
|
88
|
+
@memcpy(out, s);
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
pub fn print(comptime fmt: []const u8, args: anytype) []const u8 {
|
|
93
|
+
return std.fmt.allocPrint(arena(), fmt, args) catch @panic("plugin: out of memory");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// --- construction -----------------------------------------------------
|
|
97
|
+
|
|
98
|
+
fn make() *Value {
|
|
99
|
+
const v = arena().create(Value) catch @panic("plugin: out of memory");
|
|
100
|
+
v.* = .{};
|
|
101
|
+
return v;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
pub fn vnull() *Value {
|
|
105
|
+
return make();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
pub fn vbool(b: bool) *Value {
|
|
109
|
+
const v = make();
|
|
110
|
+
v.kind = .boolean;
|
|
111
|
+
v.boolean = b;
|
|
112
|
+
return v;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
pub fn vnum(n: f64) *Value {
|
|
116
|
+
const v = make();
|
|
117
|
+
v.kind = .num;
|
|
118
|
+
v.num = n;
|
|
119
|
+
return v;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
pub fn vstr(s: []const u8) *Value {
|
|
123
|
+
const v = make();
|
|
124
|
+
v.kind = .str;
|
|
125
|
+
v.str = s;
|
|
126
|
+
return v;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
pub fn vlist() *Value {
|
|
130
|
+
const v = make();
|
|
131
|
+
v.kind = .list;
|
|
132
|
+
v.items = List(*Value).init(arena());
|
|
133
|
+
return v;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
pub fn vmap() *Value {
|
|
137
|
+
const v = make();
|
|
138
|
+
v.kind = .map;
|
|
139
|
+
v.entries = List(Entry).init(arena());
|
|
140
|
+
return v;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// --- kinds ------------------------------------------------------------
|
|
144
|
+
|
|
145
|
+
/// A NULL POINTER MEANS "NOTHING"; a `.nul` Value means "JSON null".
|
|
146
|
+
/// They are different answers and several places need both: a `bail`
|
|
147
|
+
/// binding declining is not one answering null, and a missing export is
|
|
148
|
+
/// not an export of null. Every accessor tolerates a null pointer.
|
|
149
|
+
pub fn isNull(v: ?*const Value) bool {
|
|
150
|
+
return v == null or v.?.kind == .nul;
|
|
151
|
+
}
|
|
152
|
+
pub fn isBool(v: ?*const Value) bool {
|
|
153
|
+
return v != null and v.?.kind == .boolean;
|
|
154
|
+
}
|
|
155
|
+
pub fn isNum(v: ?*const Value) bool {
|
|
156
|
+
return v != null and v.?.kind == .num;
|
|
157
|
+
}
|
|
158
|
+
pub fn isStr(v: ?*const Value) bool {
|
|
159
|
+
return v != null and v.?.kind == .str;
|
|
160
|
+
}
|
|
161
|
+
pub fn isList(v: ?*const Value) bool {
|
|
162
|
+
return v != null and v.?.kind == .list;
|
|
163
|
+
}
|
|
164
|
+
pub fn isMap(v: ?*const Value) bool {
|
|
165
|
+
return v != null and v.?.kind == .map;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// --- access -----------------------------------------------------------
|
|
169
|
+
|
|
170
|
+
/// `get` answers a null Value for a missing key AND for a key holding
|
|
171
|
+
/// JSON null; `has` distinguishes them, which is what §9.1's "an
|
|
172
|
+
/// authored null is not an absent key" needs.
|
|
173
|
+
pub fn get(m: ?*const Value, key: []const u8) *Value {
|
|
174
|
+
if (!isMap(m)) return vnull();
|
|
175
|
+
for (m.?.entries.items) |e| {
|
|
176
|
+
if (std.mem.eql(u8, e.key, key)) return e.val;
|
|
177
|
+
}
|
|
178
|
+
return vnull();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
pub fn has(m: ?*const Value, key: []const u8) bool {
|
|
182
|
+
if (!isMap(m)) return false;
|
|
183
|
+
for (m.?.entries.items) |e| {
|
|
184
|
+
if (std.mem.eql(u8, e.key, key)) return true;
|
|
185
|
+
}
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
pub fn set(m: ?*Value, key: []const u8, val: ?*Value) void {
|
|
190
|
+
if (!isMap(m)) return;
|
|
191
|
+
const v = val orelse vnull();
|
|
192
|
+
for (m.?.entries.items) |*e| {
|
|
193
|
+
if (std.mem.eql(u8, e.key, key)) {
|
|
194
|
+
e.val = v;
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
m.?.entries.append(.{ .key = dupe(key), .val = v }) catch @panic("plugin: out of memory");
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
pub fn del(m: ?*Value, key: []const u8) void {
|
|
202
|
+
if (!isMap(m)) return;
|
|
203
|
+
var i: usize = 0;
|
|
204
|
+
while (i < m.?.entries.items.len) : (i += 1) {
|
|
205
|
+
if (std.mem.eql(u8, m.?.entries.items[i].key, key)) {
|
|
206
|
+
_ = m.?.entries.orderedRemove(i);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
pub fn at(l: ?*const Value, i: usize) *Value {
|
|
213
|
+
if (!isList(l) or i >= l.?.items.items.len) return vnull();
|
|
214
|
+
return l.?.items.items[i];
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
pub fn push(l: ?*Value, item: ?*Value) void {
|
|
218
|
+
if (!isList(l)) return;
|
|
219
|
+
l.?.items.append(item orelse vnull()) catch @panic("plugin: out of memory");
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
pub fn len(v: ?*const Value) usize {
|
|
223
|
+
if (v == null) return 0;
|
|
224
|
+
return switch (v.?.kind) {
|
|
225
|
+
.list => v.?.items.items.len,
|
|
226
|
+
.map => v.?.entries.items.len,
|
|
227
|
+
else => 0,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
pub fn items(v: ?*const Value) []*Value {
|
|
232
|
+
if (!isList(v)) return &[_]*Value{};
|
|
233
|
+
return v.?.items.items;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
pub fn asStr(v: ?*const Value) []const u8 {
|
|
237
|
+
return if (isStr(v)) v.?.str else "";
|
|
238
|
+
}
|
|
239
|
+
pub fn asNum(v: ?*const Value) f64 {
|
|
240
|
+
return if (isNum(v)) v.?.num else 0;
|
|
241
|
+
}
|
|
242
|
+
pub fn asBool(v: ?*const Value) bool {
|
|
243
|
+
return isBool(v) and v.?.boolean;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/// Keys in INSERTION order.
|
|
247
|
+
pub fn keys(m: ?*const Value) [][]const u8 {
|
|
248
|
+
if (!isMap(m)) return &[_][]const u8{};
|
|
249
|
+
const out = alloc([]const u8, m.?.entries.items.len);
|
|
250
|
+
for (m.?.entries.items, 0..) |e, i| out[i] = e.key;
|
|
251
|
+
return out;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
fn lessStr(_: void, a: []const u8, b: []const u8) bool {
|
|
255
|
+
return std.mem.order(u8, a, b) == .lt;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/// Keys SORTED by byte order — §4 rule 4's deterministic walk.
|
|
259
|
+
pub fn sortedKeys(m: ?*const Value) [][]const u8 {
|
|
260
|
+
const out = keys(m);
|
|
261
|
+
std.mem.sort([]const u8, out, {}, lessStr);
|
|
262
|
+
return out;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/// §4 rule 4: truthiness is JSON's, not zig's.
|
|
266
|
+
pub fn truthy(v: ?*const Value) bool {
|
|
267
|
+
if (v == null) return false;
|
|
268
|
+
return switch (v.?.kind) {
|
|
269
|
+
.nul => false,
|
|
270
|
+
.boolean => v.?.boolean,
|
|
271
|
+
.num => v.?.num != 0,
|
|
272
|
+
.str => v.?.str.len != 0,
|
|
273
|
+
else => true,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/// Deep equality INCLUDING JSON type, which is the half that matters:
|
|
278
|
+
/// half the ports are written in languages whose `==` says `true == 1`,
|
|
279
|
+
/// and `capability/match` exists to catch exactly that.
|
|
280
|
+
pub fn same(a: ?*const Value, b: ?*const Value) bool {
|
|
281
|
+
const anull = isNull(a);
|
|
282
|
+
const bnull = isNull(b);
|
|
283
|
+
if (anull or bnull) return anull and bnull;
|
|
284
|
+
if (a.?.kind != b.?.kind) return false;
|
|
285
|
+
return switch (a.?.kind) {
|
|
286
|
+
.boolean => a.?.boolean == b.?.boolean,
|
|
287
|
+
.num => a.?.num == b.?.num,
|
|
288
|
+
.str => std.mem.eql(u8, a.?.str, b.?.str),
|
|
289
|
+
.list => blk: {
|
|
290
|
+
if (len(a) != len(b)) break :blk false;
|
|
291
|
+
for (a.?.items.items, 0..) |x, i| {
|
|
292
|
+
if (!same(x, at(b, i))) break :blk false;
|
|
293
|
+
}
|
|
294
|
+
break :blk true;
|
|
295
|
+
},
|
|
296
|
+
.map => blk: {
|
|
297
|
+
if (len(a) != len(b)) break :blk false;
|
|
298
|
+
for (a.?.entries.items) |e| {
|
|
299
|
+
if (!has(b, e.key)) break :blk false;
|
|
300
|
+
if (!same(e.val, get(b, e.key))) break :blk false;
|
|
301
|
+
}
|
|
302
|
+
break :blk true;
|
|
303
|
+
},
|
|
304
|
+
else => true,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
pub fn clone(v: ?*const Value) ?*Value {
|
|
309
|
+
if (v == null) return null;
|
|
310
|
+
return switch (v.?.kind) {
|
|
311
|
+
.list => blk: {
|
|
312
|
+
const out = vlist();
|
|
313
|
+
for (v.?.items.items) |x| push(out, clone(x));
|
|
314
|
+
break :blk out;
|
|
315
|
+
},
|
|
316
|
+
.map => blk: {
|
|
317
|
+
const out = vmap();
|
|
318
|
+
for (v.?.entries.items) |e| set(out, e.key, clone(e.val));
|
|
319
|
+
break :blk out;
|
|
320
|
+
},
|
|
321
|
+
.boolean => vbool(v.?.boolean),
|
|
322
|
+
.num => vnum(v.?.num),
|
|
323
|
+
.str => vstr(v.?.str),
|
|
324
|
+
else => vnull(),
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// --- json -------------------------------------------------------------
|
|
329
|
+
|
|
330
|
+
/// An integral float renders as an integer: the corpus's expected values
|
|
331
|
+
/// are written `1`, not `1.0`, and a port that emits the latter fails
|
|
332
|
+
/// every comparison for a reason that has nothing to do with the
|
|
333
|
+
/// behaviour under test.
|
|
334
|
+
pub fn numStr(n: f64) []const u8 {
|
|
335
|
+
if (std.math.isFinite(n) and n == @trunc(n) and @abs(n) < 1e18) {
|
|
336
|
+
return print("{d}", .{@as(i64, @intFromFloat(n))});
|
|
337
|
+
}
|
|
338
|
+
return print("{d}", .{n});
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
fn escape(s: []const u8, buf: *List(u8)) void {
|
|
342
|
+
buf.append('"') catch @panic("oom");
|
|
343
|
+
for (s) |c| {
|
|
344
|
+
switch (c) {
|
|
345
|
+
'"' => buf.appendSlice("\\\"") catch @panic("oom"),
|
|
346
|
+
'\\' => buf.appendSlice("\\\\") catch @panic("oom"),
|
|
347
|
+
'\n' => buf.appendSlice("\\n") catch @panic("oom"),
|
|
348
|
+
'\r' => buf.appendSlice("\\r") catch @panic("oom"),
|
|
349
|
+
'\t' => buf.appendSlice("\\t") catch @panic("oom"),
|
|
350
|
+
0x08 => buf.appendSlice("\\b") catch @panic("oom"),
|
|
351
|
+
0x0C => buf.appendSlice("\\f") catch @panic("oom"),
|
|
352
|
+
else => {
|
|
353
|
+
if (c < 0x20) {
|
|
354
|
+
buf.appendSlice(print("\\u{x:0>4}", .{c})) catch @panic("oom");
|
|
355
|
+
} else {
|
|
356
|
+
buf.append(c) catch @panic("oom");
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
buf.append('"') catch @panic("oom");
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
fn render(v: ?*const Value, buf: *List(u8)) void {
|
|
365
|
+
if (isNull(v)) {
|
|
366
|
+
buf.appendSlice("null") catch @panic("oom");
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
switch (v.?.kind) {
|
|
370
|
+
.boolean => buf.appendSlice(if (v.?.boolean) "true" else "false") catch @panic("oom"),
|
|
371
|
+
.num => buf.appendSlice(numStr(v.?.num)) catch @panic("oom"),
|
|
372
|
+
.str => escape(v.?.str, buf),
|
|
373
|
+
.list => {
|
|
374
|
+
buf.append('[') catch @panic("oom");
|
|
375
|
+
for (v.?.items.items, 0..) |x, i| {
|
|
376
|
+
if (i > 0) buf.append(',') catch @panic("oom");
|
|
377
|
+
render(x, buf);
|
|
378
|
+
}
|
|
379
|
+
buf.append(']') catch @panic("oom");
|
|
380
|
+
},
|
|
381
|
+
.map => {
|
|
382
|
+
// SORTED, so two values that are `same` render identically.
|
|
383
|
+
buf.append('{') catch @panic("oom");
|
|
384
|
+
for (sortedKeys(v), 0..) |k, i| {
|
|
385
|
+
if (i > 0) buf.append(',') catch @panic("oom");
|
|
386
|
+
escape(k, buf);
|
|
387
|
+
buf.append(':') catch @panic("oom");
|
|
388
|
+
render(get(v, k), buf);
|
|
389
|
+
}
|
|
390
|
+
buf.append('}') catch @panic("oom");
|
|
391
|
+
},
|
|
392
|
+
else => buf.appendSlice("null") catch @panic("oom"),
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
pub fn json(v: ?*const Value) []const u8 {
|
|
397
|
+
var buf = List(u8).init(arena());
|
|
398
|
+
render(v, &buf);
|
|
399
|
+
return buf.items;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
pub const ParseError = error{BadJson};
|
|
403
|
+
|
|
404
|
+
const Parser = struct {
|
|
405
|
+
text: []const u8,
|
|
406
|
+
i: usize = 0,
|
|
407
|
+
err: []const u8 = "",
|
|
408
|
+
|
|
409
|
+
fn digit(p: *Parser) bool {
|
|
410
|
+
return p.i < p.text.len and p.text[p.i] >= '0' and p.text[p.i] <= '9';
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
fn skip(p: *Parser) void {
|
|
414
|
+
while (p.i < p.text.len) {
|
|
415
|
+
const c = p.text[p.i];
|
|
416
|
+
if (c == ' ' or c == '\t' or c == '\n' or c == '\r') p.i += 1 else break;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
fn lit(p: *Parser, word: []const u8) bool {
|
|
421
|
+
if (p.i + word.len > p.text.len) return false;
|
|
422
|
+
if (!std.mem.eql(u8, p.text[p.i .. p.i + word.len], word)) return false;
|
|
423
|
+
p.i += word.len;
|
|
424
|
+
return true;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
fn hex4(p: *Parser) ?u21 {
|
|
428
|
+
if (p.i + 4 > p.text.len) return null;
|
|
429
|
+
var acc: u21 = 0;
|
|
430
|
+
var k: usize = 0;
|
|
431
|
+
while (k < 4) : (k += 1) {
|
|
432
|
+
const d = std.fmt.charToDigit(p.text[p.i + k], 16) catch return null;
|
|
433
|
+
acc = acc * 16 + d;
|
|
434
|
+
}
|
|
435
|
+
p.i += 4;
|
|
436
|
+
return acc;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
fn string(p: *Parser, buf: *List(u8)) bool {
|
|
440
|
+
if (p.i >= p.text.len or p.text[p.i] != '"') {
|
|
441
|
+
p.err = "expected a string";
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
444
|
+
p.i += 1;
|
|
445
|
+
while (p.i < p.text.len and p.text[p.i] != '"') {
|
|
446
|
+
const c = p.text[p.i];
|
|
447
|
+
if (c != '\\') {
|
|
448
|
+
buf.append(c) catch @panic("oom");
|
|
449
|
+
p.i += 1;
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
p.i += 1;
|
|
453
|
+
if (p.i >= p.text.len) {
|
|
454
|
+
p.err = "unterminated escape";
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
const e = p.text[p.i];
|
|
458
|
+
p.i += 1;
|
|
459
|
+
switch (e) {
|
|
460
|
+
'"' => buf.append('"') catch @panic("oom"),
|
|
461
|
+
'\\' => buf.append('\\') catch @panic("oom"),
|
|
462
|
+
'/' => buf.append('/') catch @panic("oom"),
|
|
463
|
+
'n' => buf.append('\n') catch @panic("oom"),
|
|
464
|
+
'r' => buf.append('\r') catch @panic("oom"),
|
|
465
|
+
't' => buf.append('\t') catch @panic("oom"),
|
|
466
|
+
'b' => buf.append(0x08) catch @panic("oom"),
|
|
467
|
+
'f' => buf.append(0x0C) catch @panic("oom"),
|
|
468
|
+
'u' => {
|
|
469
|
+
const hi = p.hex4() orelse {
|
|
470
|
+
p.err = "bad \\u escape";
|
|
471
|
+
return false;
|
|
472
|
+
};
|
|
473
|
+
var cp: u21 = hi;
|
|
474
|
+
if (hi >= 0xD800 and hi <= 0xDBFF and p.i + 1 < p.text.len and
|
|
475
|
+
p.text[p.i] == '\\' and p.text[p.i + 1] == 'u')
|
|
476
|
+
{
|
|
477
|
+
p.i += 2;
|
|
478
|
+
const lo = p.hex4() orelse {
|
|
479
|
+
p.err = "bad \\u escape";
|
|
480
|
+
return false;
|
|
481
|
+
};
|
|
482
|
+
cp = 0x10000 + ((hi - 0xD800) << 10) + (lo - 0xDC00);
|
|
483
|
+
}
|
|
484
|
+
var tmp: [4]u8 = undefined;
|
|
485
|
+
const n = std.unicode.utf8Encode(cp, &tmp) catch {
|
|
486
|
+
p.err = "bad code point";
|
|
487
|
+
return false;
|
|
488
|
+
};
|
|
489
|
+
buf.appendSlice(tmp[0..n]) catch @panic("oom");
|
|
490
|
+
},
|
|
491
|
+
else => {
|
|
492
|
+
p.err = "bad escape";
|
|
493
|
+
return false;
|
|
494
|
+
},
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
if (p.i >= p.text.len) {
|
|
498
|
+
p.err = "unterminated string";
|
|
499
|
+
return false;
|
|
500
|
+
}
|
|
501
|
+
p.i += 1;
|
|
502
|
+
return true;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
fn value(p: *Parser) ?*Value {
|
|
506
|
+
p.skip();
|
|
507
|
+
if (p.i >= p.text.len) {
|
|
508
|
+
p.err = "unexpected end of input";
|
|
509
|
+
return null;
|
|
510
|
+
}
|
|
511
|
+
const c = p.text[p.i];
|
|
512
|
+
|
|
513
|
+
if (c == 'n') {
|
|
514
|
+
if (!p.lit("null")) {
|
|
515
|
+
p.err = "bad literal";
|
|
516
|
+
return null;
|
|
517
|
+
}
|
|
518
|
+
return vnull();
|
|
519
|
+
}
|
|
520
|
+
if (c == 't') {
|
|
521
|
+
if (!p.lit("true")) {
|
|
522
|
+
p.err = "bad literal";
|
|
523
|
+
return null;
|
|
524
|
+
}
|
|
525
|
+
return vbool(true);
|
|
526
|
+
}
|
|
527
|
+
if (c == 'f') {
|
|
528
|
+
if (!p.lit("false")) {
|
|
529
|
+
p.err = "bad literal";
|
|
530
|
+
return null;
|
|
531
|
+
}
|
|
532
|
+
return vbool(false);
|
|
533
|
+
}
|
|
534
|
+
if (c == '"') {
|
|
535
|
+
var buf = List(u8).init(arena());
|
|
536
|
+
if (!p.string(&buf)) return null;
|
|
537
|
+
return vstr(buf.items);
|
|
538
|
+
}
|
|
539
|
+
if (c == '[') {
|
|
540
|
+
p.i += 1;
|
|
541
|
+
const out = vlist();
|
|
542
|
+
p.skip();
|
|
543
|
+
if (p.i < p.text.len and p.text[p.i] == ']') {
|
|
544
|
+
p.i += 1;
|
|
545
|
+
return out;
|
|
546
|
+
}
|
|
547
|
+
while (true) {
|
|
548
|
+
const item = p.value() orelse return null;
|
|
549
|
+
push(out, item);
|
|
550
|
+
p.skip();
|
|
551
|
+
if (p.i < p.text.len and p.text[p.i] == ',') {
|
|
552
|
+
p.i += 1;
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
555
|
+
if (p.i < p.text.len and p.text[p.i] == ']') {
|
|
556
|
+
p.i += 1;
|
|
557
|
+
return out;
|
|
558
|
+
}
|
|
559
|
+
p.err = "expected , or ] in array";
|
|
560
|
+
return null;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
if (c == '{') {
|
|
564
|
+
p.i += 1;
|
|
565
|
+
const out = vmap();
|
|
566
|
+
p.skip();
|
|
567
|
+
if (p.i < p.text.len and p.text[p.i] == '}') {
|
|
568
|
+
p.i += 1;
|
|
569
|
+
return out;
|
|
570
|
+
}
|
|
571
|
+
while (true) {
|
|
572
|
+
p.skip();
|
|
573
|
+
var kbuf = List(u8).init(arena());
|
|
574
|
+
if (!p.string(&kbuf)) return null;
|
|
575
|
+
p.skip();
|
|
576
|
+
if (p.i >= p.text.len or p.text[p.i] != ':') {
|
|
577
|
+
p.err = "expected : in object";
|
|
578
|
+
return null;
|
|
579
|
+
}
|
|
580
|
+
p.i += 1;
|
|
581
|
+
const val = p.value() orelse return null;
|
|
582
|
+
set(out, kbuf.items, val);
|
|
583
|
+
p.skip();
|
|
584
|
+
if (p.i < p.text.len and p.text[p.i] == ',') {
|
|
585
|
+
p.i += 1;
|
|
586
|
+
continue;
|
|
587
|
+
}
|
|
588
|
+
if (p.i < p.text.len and p.text[p.i] == '}') {
|
|
589
|
+
p.i += 1;
|
|
590
|
+
return out;
|
|
591
|
+
}
|
|
592
|
+
p.err = "expected , or } in object";
|
|
593
|
+
return null;
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
// JSON's number grammar is STRICT, and §9.5 makes that
|
|
598
|
+
// observable: env values "parse as JSON, falling back to
|
|
599
|
+
// string", so anything this reader accepts loosely silently
|
|
600
|
+
// becomes a number where the canonical keeps the authored
|
|
601
|
+
// string. `1e`, `1.`, `01`, `.5` and a bare `-` are all errors
|
|
602
|
+
// to JSON.parse; only `-0` and `1e5` are not.
|
|
603
|
+
//
|
|
604
|
+
// number = [ '-' ] int [ frac ] [ exp ]
|
|
605
|
+
// int = '0' | digit1-9 *digit
|
|
606
|
+
// frac = '.' 1*digit
|
|
607
|
+
// exp = ('e'|'E') [ '+' | '-' ] 1*digit
|
|
608
|
+
const start = p.i;
|
|
609
|
+
if (p.i < p.text.len and p.text[p.i] == '-') p.i += 1;
|
|
610
|
+
if (!p.digit()) {
|
|
611
|
+
p.err = "bad number";
|
|
612
|
+
return null;
|
|
613
|
+
}
|
|
614
|
+
if (p.text[p.i] == '0') p.i += 1 else while (p.digit()) p.i += 1;
|
|
615
|
+
if (p.i < p.text.len and p.text[p.i] == '.') {
|
|
616
|
+
p.i += 1;
|
|
617
|
+
if (!p.digit()) {
|
|
618
|
+
p.err = "bad number";
|
|
619
|
+
return null;
|
|
620
|
+
}
|
|
621
|
+
while (p.digit()) p.i += 1;
|
|
622
|
+
}
|
|
623
|
+
if (p.i < p.text.len and (p.text[p.i] == 'e' or p.text[p.i] == 'E')) {
|
|
624
|
+
p.i += 1;
|
|
625
|
+
if (p.i < p.text.len and (p.text[p.i] == '+' or p.text[p.i] == '-')) p.i += 1;
|
|
626
|
+
if (!p.digit()) {
|
|
627
|
+
p.err = "bad number";
|
|
628
|
+
return null;
|
|
629
|
+
}
|
|
630
|
+
while (p.digit()) p.i += 1;
|
|
631
|
+
}
|
|
632
|
+
if (start == p.i) {
|
|
633
|
+
p.err = "unexpected character";
|
|
634
|
+
return null;
|
|
635
|
+
}
|
|
636
|
+
// A REPORTED failure, not a crash: a bare `-` or a truncated
|
|
637
|
+
// `1e` reaches here from `env`'s parse-or-string fallback (§9.5),
|
|
638
|
+
// and a reader that panics on a bad number rather than reporting
|
|
639
|
+
// one turns "this env value is a string" into a crash. The ocaml
|
|
640
|
+
// port hit this first.
|
|
641
|
+
const n = std.fmt.parseFloat(f64, p.text[start..p.i]) catch {
|
|
642
|
+
p.err = "bad number";
|
|
643
|
+
return null;
|
|
644
|
+
};
|
|
645
|
+
return vnum(n);
|
|
646
|
+
}
|
|
647
|
+
};
|
|
648
|
+
|
|
649
|
+
/// Parse, or null with `err` set to a message.
|
|
650
|
+
pub fn parse(text: []const u8, err: *[]const u8) ?*Value {
|
|
651
|
+
var p = Parser{ .text = text };
|
|
652
|
+
const out = p.value() orelse {
|
|
653
|
+
err.* = p.err;
|
|
654
|
+
return null;
|
|
655
|
+
};
|
|
656
|
+
p.skip();
|
|
657
|
+
if (p.i != p.text.len) {
|
|
658
|
+
err.* = "trailing content";
|
|
659
|
+
return null;
|
|
660
|
+
}
|
|
661
|
+
return out;
|
|
662
|
+
}
|