@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,440 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (zig/src/provider.zig)
|
|
2
|
+
// Source: https://github.com/voxgig/sekreto @ 1267ee2e5f49566bc92695bc9eb3a60ef4924998 [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
//! What a provider is, what its declarative form looks like, and how a
|
|
5
|
+
//! provider kind becomes a voxgig/plugin definition.
|
|
6
|
+
//!
|
|
7
|
+
//! A provider answers one question: "do you have this secret?" It returns
|
|
8
|
+
//! the value, or null to mean "ask the next one". Nothing else about a
|
|
9
|
+
//! provider is visible to the caller - which is the point: an app reads
|
|
10
|
+
//! `api.token` and never learns whether it came from the environment, a
|
|
11
|
+
//! .env file, HashiCorp Vault, AWS, GCP, Azure or a boru vault.
|
|
12
|
+
//!
|
|
13
|
+
//! Two failure shapes, and they are never interchangeable. A store that
|
|
14
|
+
//! does not hold the secret is a MISS (`.ok = null`) - the chain carries
|
|
15
|
+
//! on. A store that could not answer - bad credentials, unreachable host,
|
|
16
|
+
//! missing configuration - is an ERROR (`.err`): falling through there
|
|
17
|
+
//! would quietly reach for a weaker store.
|
|
18
|
+
//!
|
|
19
|
+
//! `Provider` is a VTABLE, not the tagged union it used to be. The union
|
|
20
|
+
//! named all fourteen kinds, and a core that names every kind links
|
|
21
|
+
//! every kind; the set is open now - four built in here, ten under
|
|
22
|
+
//! `../plugins/`, and any number a calling project makes with
|
|
23
|
+
//! `providerplugin` - so the core holds a pointer and three function
|
|
24
|
+
//! pointers and knows nothing else.
|
|
25
|
+
//!
|
|
26
|
+
//! A port of typescript/src/provider/support.ts, which is canonical.
|
|
27
|
+
|
|
28
|
+
const std = @import("std");
|
|
29
|
+
|
|
30
|
+
const plugin = @import("plugin");
|
|
31
|
+
const sekreto = @import("sekreto.zig");
|
|
32
|
+
|
|
33
|
+
const Allocator = std.mem.Allocator;
|
|
34
|
+
const Answer = sekreto.Answer;
|
|
35
|
+
const Found = sekreto.Found;
|
|
36
|
+
const pv = plugin.value;
|
|
37
|
+
const pt = plugin.types;
|
|
38
|
+
|
|
39
|
+
/// A voxgig/plugin definition: what `Sekreto` builds a provider from.
|
|
40
|
+
pub const Definition = plugin.host.Definition;
|
|
41
|
+
pub const Inst = plugin.host.Inst;
|
|
42
|
+
|
|
43
|
+
/// What the library needs from the process it runs in.
|
|
44
|
+
///
|
|
45
|
+
/// Passed in rather than reached for, because Zig 0.16 hands both to `main`
|
|
46
|
+
/// and because a library that samples global state cannot be tested. The
|
|
47
|
+
/// environment is read by the `env` provider and by every store that
|
|
48
|
+
/// follows its own ecosystem's convention (AWS_*, GCE_METADATA_HOST); `io`
|
|
49
|
+
/// is what opens sockets, reads files and runs the boru binary.
|
|
50
|
+
pub const Config = struct {
|
|
51
|
+
io: std.Io,
|
|
52
|
+
env: *const std.process.Environ.Map,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/// One literal secret, for the `memory` provider. A list rather than a map
|
|
56
|
+
/// because the spec pins the whole map and randomised iteration would make
|
|
57
|
+
/// that comparison depend on the run.
|
|
58
|
+
pub const KeyValue = struct {
|
|
59
|
+
key: []const u8,
|
|
60
|
+
value: []const u8,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/// Logging in for a token instead of being handed one.
|
|
64
|
+
pub const Auth = struct {
|
|
65
|
+
/// `kubernetes` or `approle`.
|
|
66
|
+
method: []const u8 = "",
|
|
67
|
+
/// The auth mount, defaulting to the method name.
|
|
68
|
+
mount: []const u8 = "",
|
|
69
|
+
/// kubernetes: the Vault role to log in as.
|
|
70
|
+
role: []const u8 = "",
|
|
71
|
+
/// kubernetes: the service-account JWT itself (tests).
|
|
72
|
+
jwt: ?[]const u8 = null,
|
|
73
|
+
/// kubernetes: where the JWT lives; the conventional pod path by default.
|
|
74
|
+
jwtfile: []const u8 = "",
|
|
75
|
+
/// approle: the role and secret ids.
|
|
76
|
+
roleid: []const u8 = "",
|
|
77
|
+
secretid: []const u8 = "",
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/// The declarative form of a provider, as used in config and in the shared
|
|
81
|
+
/// spec: a `kind` naming a built-in or a plugin, plus that kind's own
|
|
82
|
+
/// configuration.
|
|
83
|
+
///
|
|
84
|
+
/// Every string defaults to empty rather than being optional: "not
|
|
85
|
+
/// configured" and "configured empty" mean the same thing for every field
|
|
86
|
+
/// here, and one representation is one fewer thing to get wrong.
|
|
87
|
+
///
|
|
88
|
+
/// A spec reaches its plugin as the instance's OPTIONS, the voxgig/plugin
|
|
89
|
+
/// dynamic value: `Sekreto.init` encodes it with `optionsof` (the field
|
|
90
|
+
/// names are the keys, as they are in every port's spec) and the
|
|
91
|
+
/// definition's `define` reads it back with `specof`. Every string is
|
|
92
|
+
/// COPIED into the plugin arena on the way in, so the caller's strings
|
|
93
|
+
/// need not outlive the chain.
|
|
94
|
+
pub const ProviderSpec = struct {
|
|
95
|
+
kind: []const u8,
|
|
96
|
+
/// The store name `Sekreto.getfrom` addresses. Defaults to `kind`.
|
|
97
|
+
name: []const u8 = "",
|
|
98
|
+
prefix: []const u8 = "",
|
|
99
|
+
/// dotenv: the file to read. secretspec: the declaration file.
|
|
100
|
+
file: []const u8 = "",
|
|
101
|
+
/// memory: literal values, keyed like environment variables.
|
|
102
|
+
values: []const KeyValue = &.{},
|
|
103
|
+
/// file: the directory of one-secret-per-file entries.
|
|
104
|
+
dir: []const u8 = "",
|
|
105
|
+
/// hashicorp / boru (wire) / gcp / 1password / doppler / infisical: the
|
|
106
|
+
/// base URL.
|
|
107
|
+
addr: []const u8 = "",
|
|
108
|
+
/// hashicorp / boru (wire) / gcp / azure / 1password / doppler /
|
|
109
|
+
/// infisical: the access token.
|
|
110
|
+
token: []const u8 = "",
|
|
111
|
+
/// hashicorp / boru (wire): the KV mount (default `secret`).
|
|
112
|
+
mount: []const u8 = "",
|
|
113
|
+
/// hashicorp: KV engine version, 1 or 2 (default 2). Zero means unset.
|
|
114
|
+
kv: i64 = 0,
|
|
115
|
+
/// hashicorp: Vault Enterprise namespace (X-Vault-Namespace).
|
|
116
|
+
vaultnamespace: []const u8 = "",
|
|
117
|
+
/// hashicorp: log in for a token instead of being handed one.
|
|
118
|
+
auth: ?Auth = null,
|
|
119
|
+
/// boru / secretspec: the executable to run (default: the kind's own
|
|
120
|
+
/// name).
|
|
121
|
+
command: []const u8 = "",
|
|
122
|
+
/// secretspec: the profile to read (`--profile`).
|
|
123
|
+
profile: []const u8 = "",
|
|
124
|
+
/// secretspec: which of ITS backends to read from (`--provider`), e.g.
|
|
125
|
+
/// `keyring` or `dotenv://.env`. Named `backend` here because
|
|
126
|
+
/// `provider` already means a sekreto provider.
|
|
127
|
+
backend: []const u8 = "",
|
|
128
|
+
/// secretspec: the audit reason recorded for the read (`--reason`).
|
|
129
|
+
/// SecretSpec refuses to read without one.
|
|
130
|
+
reason: []const u8 = "",
|
|
131
|
+
/// boru: the namespace qualifying the alias.
|
|
132
|
+
namespace: []const u8 = "",
|
|
133
|
+
/// boru: the vault home, passed as BORU_HOME.
|
|
134
|
+
home: []const u8 = "",
|
|
135
|
+
/// aws: region and credentials; the standard AWS_* environment
|
|
136
|
+
/// variables fill whichever are not given.
|
|
137
|
+
region: []const u8 = "",
|
|
138
|
+
keyid: []const u8 = "",
|
|
139
|
+
secret: []const u8 = "",
|
|
140
|
+
session: []const u8 = "",
|
|
141
|
+
/// gcp / doppler / infisical: the project (GCP project id, Doppler
|
|
142
|
+
/// project slug, Infisical workspace id).
|
|
143
|
+
project: []const u8 = "",
|
|
144
|
+
/// azure: the Key Vault name or full URL. 1password: the vault name or id.
|
|
145
|
+
vault: []const u8 = "",
|
|
146
|
+
/// azure: client-credential login. infisical: universal-auth login
|
|
147
|
+
/// (tenant is Azure-only).
|
|
148
|
+
tenant: []const u8 = "",
|
|
149
|
+
clientid: []const u8 = "",
|
|
150
|
+
clientsecret: []const u8 = "",
|
|
151
|
+
/// azure: where to log in / where IMDS answers. gcp: where the metadata
|
|
152
|
+
/// server answers.
|
|
153
|
+
loginaddr: []const u8 = "",
|
|
154
|
+
imdsaddr: []const u8 = "",
|
|
155
|
+
metadataaddr: []const u8 = "",
|
|
156
|
+
/// azure: the Key Vault API version (default 7.4).
|
|
157
|
+
apiversion: []const u8 = "",
|
|
158
|
+
/// doppler: the config slug (with `project`).
|
|
159
|
+
config: []const u8 = "",
|
|
160
|
+
/// infisical: the environment slug and secret path.
|
|
161
|
+
environment: []const u8 = "",
|
|
162
|
+
path: []const u8 = "",
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
// ---- the provider ----------------------------------------------------
|
|
166
|
+
|
|
167
|
+
/// A source of secrets: a pointer and three function pointers.
|
|
168
|
+
///
|
|
169
|
+
/// `lookup`'s `alloc` is scratch for one lookup; what a provider keeps
|
|
170
|
+
/// between lookups it allocates from its own allocator instead. `describe`
|
|
171
|
+
/// ALWAYS allocates, even for a kind whose description is a constant: a
|
|
172
|
+
/// caller that sometimes gets a literal and sometimes an allocation cannot
|
|
173
|
+
/// free either one safely. `deinit` releases what the provider holds AND
|
|
174
|
+
/// the provider itself.
|
|
175
|
+
pub const Provider = struct {
|
|
176
|
+
ptr: *anyopaque,
|
|
177
|
+
vtable: *const VTable,
|
|
178
|
+
|
|
179
|
+
pub const VTable = struct {
|
|
180
|
+
lookup: *const fn (*anyopaque, Allocator, []const u8) Allocator.Error!Found,
|
|
181
|
+
describe: *const fn (*anyopaque, Allocator) Allocator.Error![]const u8,
|
|
182
|
+
deinit: *const fn (*anyopaque, Allocator) void,
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
/// The value, null if this provider does not have it, or the message of
|
|
186
|
+
/// a failure.
|
|
187
|
+
pub fn lookup(self: Provider, alloc: Allocator, name: []const u8) Allocator.Error!Found {
|
|
188
|
+
return self.vtable.lookup(self.ptr, alloc, name);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/// A short description, shown by `Sekreto.sources()`. It must lead with
|
|
192
|
+
/// the kind: everything before the first `:` is the default store name.
|
|
193
|
+
pub fn describe(self: Provider, alloc: Allocator) Allocator.Error![]const u8 {
|
|
194
|
+
return self.vtable.describe(self.ptr, alloc);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
pub fn deinit(self: Provider, alloc: Allocator) void {
|
|
198
|
+
self.vtable.deinit(self.ptr, alloc);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
/// A concrete provider - any struct with `lookup`, `describe` and `deinit`
|
|
203
|
+
/// methods of the shapes above - behind the vtable. The struct is expected
|
|
204
|
+
/// to have been allocated with the allocator its `deinit` will be handed,
|
|
205
|
+
/// which is what `provide` guarantees.
|
|
206
|
+
pub fn adapt(comptime T: type, ptr: *T) Provider {
|
|
207
|
+
const Gen = struct {
|
|
208
|
+
fn lookup(p: *anyopaque, alloc: Allocator, name: []const u8) Allocator.Error!Found {
|
|
209
|
+
const self: *T = @ptrCast(@alignCast(p));
|
|
210
|
+
return self.lookup(alloc, name);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
fn describe(p: *anyopaque, alloc: Allocator) Allocator.Error![]const u8 {
|
|
214
|
+
const self: *T = @ptrCast(@alignCast(p));
|
|
215
|
+
return self.describe(alloc);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
fn deinit(p: *anyopaque, alloc: Allocator) void {
|
|
219
|
+
const self: *T = @ptrCast(@alignCast(p));
|
|
220
|
+
self.deinit(alloc);
|
|
221
|
+
alloc.destroy(self);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const vtable = Provider.VTable{
|
|
225
|
+
.lookup = lookup,
|
|
226
|
+
.describe = describe,
|
|
227
|
+
.deinit = deinit,
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
return .{ .ptr = ptr, .vtable = &Gen.vtable };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/// Allocate a concrete provider and present it as a `Provider`. Every
|
|
235
|
+
/// built-in and every shipped plugin builds its provider this way.
|
|
236
|
+
pub fn provide(alloc: Allocator, comptime T: type, value: T) Allocator.Error!Provider {
|
|
237
|
+
const ptr = try alloc.create(T);
|
|
238
|
+
ptr.* = value;
|
|
239
|
+
return adapt(T, ptr);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// ---- the spec as plugin options --------------------------------------
|
|
243
|
+
|
|
244
|
+
/// The export key under which a provider definition publishes the
|
|
245
|
+
/// provider it built. `Sekreto` reads `<ref>/provider` off the host.
|
|
246
|
+
pub const PROVIDER_EXPORT = "provider";
|
|
247
|
+
|
|
248
|
+
/// The voxgig/plugin error code a sekreto failure travels under when it is
|
|
249
|
+
/// raised inside a definition's `define`.
|
|
250
|
+
///
|
|
251
|
+
/// plugin wraps a code-less error raised by a callback as
|
|
252
|
+
/// `plugin_define_failed`, and keeps an error that already carries a
|
|
253
|
+
/// code. A provider that refuses its own configuration - `kv: 3`, a
|
|
254
|
+
/// missing project - answers with a message, and that message is pinned
|
|
255
|
+
/// by the spec byte for byte, so it must come back out of the host
|
|
256
|
+
/// exactly as it went in. `providerplugin` gives it this code on the way
|
|
257
|
+
/// in; `Sekreto` turns it back into the same message on the way out.
|
|
258
|
+
pub const ERROR_CODE = "sekreto_error";
|
|
259
|
+
|
|
260
|
+
fn setstr(m: *pv.Value, key: []const u8, text: []const u8) void {
|
|
261
|
+
if (0 != text.len) {
|
|
262
|
+
pv.set(m, key, pv.vstr(pv.dupe(text)));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/// A spec as the options map a plugin instance carries: one key per
|
|
267
|
+
/// field that is set, named as the field is - the spec's own key names in
|
|
268
|
+
/// every port. Strings are copied into the plugin arena.
|
|
269
|
+
pub fn optionsof(spec: ProviderSpec) *pv.Value {
|
|
270
|
+
const out = pv.vmap();
|
|
271
|
+
|
|
272
|
+
inline for (std.meta.fields(ProviderSpec)) |f| {
|
|
273
|
+
const value = @field(spec, f.name);
|
|
274
|
+
|
|
275
|
+
if ([]const u8 == f.type) {
|
|
276
|
+
setstr(out, f.name, value);
|
|
277
|
+
} else if (i64 == f.type) {
|
|
278
|
+
if (0 != value) {
|
|
279
|
+
pv.set(out, f.name, pv.vnum(@floatFromInt(value)));
|
|
280
|
+
}
|
|
281
|
+
} else if (?Auth == f.type) {
|
|
282
|
+
if (value) |auth| {
|
|
283
|
+
const m = pv.vmap();
|
|
284
|
+
setstr(m, "method", auth.method);
|
|
285
|
+
setstr(m, "mount", auth.mount);
|
|
286
|
+
setstr(m, "role", auth.role);
|
|
287
|
+
if (auth.jwt) |jwt| {
|
|
288
|
+
pv.set(m, "jwt", pv.vstr(pv.dupe(jwt)));
|
|
289
|
+
}
|
|
290
|
+
setstr(m, "jwtfile", auth.jwtfile);
|
|
291
|
+
setstr(m, "roleid", auth.roleid);
|
|
292
|
+
setstr(m, "secretid", auth.secretid);
|
|
293
|
+
pv.set(out, f.name, m);
|
|
294
|
+
}
|
|
295
|
+
} else if ([]const KeyValue == f.type) {
|
|
296
|
+
if (0 != value.len) {
|
|
297
|
+
const m = pv.vmap();
|
|
298
|
+
for (value) |pair| {
|
|
299
|
+
pv.set(m, pair.key, pv.vstr(pv.dupe(pair.value)));
|
|
300
|
+
}
|
|
301
|
+
pv.set(out, f.name, m);
|
|
302
|
+
}
|
|
303
|
+
} else {
|
|
304
|
+
@compileError("ProviderSpec field with no options encoding: " ++ f.name);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return out;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/// The spec a plugin instance's options describe: the inverse of
|
|
312
|
+
/// `optionsof`. The strings are the options' own, which live in the
|
|
313
|
+
/// plugin arena for the life of the process.
|
|
314
|
+
pub fn specof(options: ?*const pv.Value) ProviderSpec {
|
|
315
|
+
var spec = ProviderSpec{ .kind = "" };
|
|
316
|
+
|
|
317
|
+
inline for (std.meta.fields(ProviderSpec)) |f| {
|
|
318
|
+
const given = pv.get(options, f.name);
|
|
319
|
+
|
|
320
|
+
if ([]const u8 == f.type) {
|
|
321
|
+
@field(spec, f.name) = pv.asStr(given);
|
|
322
|
+
} else if (i64 == f.type) {
|
|
323
|
+
if (pv.isNum(given)) {
|
|
324
|
+
@field(spec, f.name) = @intFromFloat(pv.asNum(given));
|
|
325
|
+
}
|
|
326
|
+
} else if (?Auth == f.type) {
|
|
327
|
+
if (pv.isMap(given)) {
|
|
328
|
+
const jwt = pv.get(given, "jwt");
|
|
329
|
+
@field(spec, f.name) = .{
|
|
330
|
+
.method = pv.asStr(pv.get(given, "method")),
|
|
331
|
+
.mount = pv.asStr(pv.get(given, "mount")),
|
|
332
|
+
.role = pv.asStr(pv.get(given, "role")),
|
|
333
|
+
.jwt = if (pv.isStr(jwt)) pv.asStr(jwt) else null,
|
|
334
|
+
.jwtfile = pv.asStr(pv.get(given, "jwtfile")),
|
|
335
|
+
.roleid = pv.asStr(pv.get(given, "roleid")),
|
|
336
|
+
.secretid = pv.asStr(pv.get(given, "secretid")),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
} else if ([]const KeyValue == f.type) {
|
|
340
|
+
if (pv.isMap(given)) {
|
|
341
|
+
const keys = pv.keys(given);
|
|
342
|
+
const pairs = pv.arena().alloc(KeyValue, keys.len) catch @panic("sekreto: out of memory");
|
|
343
|
+
for (keys, 0..) |key, at| {
|
|
344
|
+
pairs[at] = .{ .key = key, .value = pv.asStr(pv.get(given, key)) };
|
|
345
|
+
}
|
|
346
|
+
@field(spec, f.name) = pairs;
|
|
347
|
+
}
|
|
348
|
+
} else {
|
|
349
|
+
@compileError("ProviderSpec field with no options encoding: " ++ f.name);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return spec;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// ---- providers as voxgig/plugin definitions --------------------------
|
|
357
|
+
|
|
358
|
+
/// What a definition's `define` needs that the plugin host cannot carry:
|
|
359
|
+
/// the allocator, the process config, and somewhere to put the provider
|
|
360
|
+
/// it built. voxgig/plugin's values are numbers and strings, not
|
|
361
|
+
/// pointers, so `define` exports the INDEX of its provider in `made` and
|
|
362
|
+
/// `Sekreto.init` reads it back through the host's exports.
|
|
363
|
+
///
|
|
364
|
+
/// MODULE-GLOBAL, for the reason voxgig/plugin's own zig port keeps its
|
|
365
|
+
/// error slot global: a lifecycle callback is a bare function pointer
|
|
366
|
+
/// with no context, so what it needs travels beside the call. It is set
|
|
367
|
+
/// for the duration of `Sekreto.init` and null otherwise; two threads
|
|
368
|
+
/// constructing chains at once would race it, and this port - like the
|
|
369
|
+
/// plugin port under it - does not claim to support that.
|
|
370
|
+
pub const Building = struct {
|
|
371
|
+
alloc: Allocator,
|
|
372
|
+
config: Config,
|
|
373
|
+
made: std.ArrayList(Provider) = .empty,
|
|
374
|
+
/// Allocation failure inside a callback, which cannot cross the
|
|
375
|
+
/// plugin boundary as a zig error and is raised again on the far side.
|
|
376
|
+
oom: bool = false,
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
pub var building: ?*Building = null;
|
|
380
|
+
|
|
381
|
+
/// How a kind builds its provider: from the allocator, the process config
|
|
382
|
+
/// and the spec. A refusal is a returned message, never a zig error.
|
|
383
|
+
pub const MakeFn = *const fn (Allocator, Config, ProviderSpec) Allocator.Error!Answer(Provider);
|
|
384
|
+
|
|
385
|
+
/// A provider kind, as a voxgig/plugin definition.
|
|
386
|
+
///
|
|
387
|
+
/// This is the whole bridge between the two libraries. The definition's
|
|
388
|
+
/// `name` is the `kind` a ProviderSpec names; its `define` reads the spec
|
|
389
|
+
/// off the instance's options, builds the provider with `make`, and
|
|
390
|
+
/// exports it. Nothing runs at `activate`: a provider opens nothing until
|
|
391
|
+
/// its first lookup, so there is nothing to capture - a provider that does
|
|
392
|
+
/// hold a resource acquires it there and lets the instance scope unwind
|
|
393
|
+
/// it.
|
|
394
|
+
///
|
|
395
|
+
/// Every built-in and every plugin is made this way, so a custom provider
|
|
396
|
+
/// kind is one call, at comptime:
|
|
397
|
+
///
|
|
398
|
+
/// pub const mystore = sekreto.providerplugin("mystore", make);
|
|
399
|
+
///
|
|
400
|
+
/// where `make` returns `sekreto.provide(alloc, MyStore, .{ ... })` or the
|
|
401
|
+
/// message of its refusal.
|
|
402
|
+
pub fn providerplugin(comptime kind: []const u8, comptime makefn: MakeFn) Definition {
|
|
403
|
+
const Gen = struct {
|
|
404
|
+
fn define(inst: *Inst) pt.Err!void {
|
|
405
|
+
const b = building orelse {
|
|
406
|
+
return pt.fail("plugin_bad_state", "sekreto: a provider was built outside Sekreto.init", null);
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
const spec = specof(inst.options);
|
|
410
|
+
|
|
411
|
+
const made = makefn(b.alloc, b.config, spec) catch {
|
|
412
|
+
b.oom = true;
|
|
413
|
+
return pt.fail(ERROR_CODE, "sekreto: out of memory", null);
|
|
414
|
+
};
|
|
415
|
+
|
|
416
|
+
switch (made) {
|
|
417
|
+
.err => |message| {
|
|
418
|
+
// The message is the caller's allocation; the host keeps
|
|
419
|
+
// its own copy, and so does the `cause` that comes back
|
|
420
|
+
// out byte for byte.
|
|
421
|
+
defer b.alloc.free(message);
|
|
422
|
+
const details = pv.vmap();
|
|
423
|
+
pv.set(details, "ref", pv.vstr(inst.ref));
|
|
424
|
+
pv.set(details, "cause", pv.vstr(pv.dupe(message)));
|
|
425
|
+
return pt.fail(ERROR_CODE, message, details);
|
|
426
|
+
},
|
|
427
|
+
.ok => |provider| {
|
|
428
|
+
b.made.append(b.alloc, provider) catch {
|
|
429
|
+
provider.deinit(b.alloc);
|
|
430
|
+
b.oom = true;
|
|
431
|
+
return pt.fail(ERROR_CODE, "sekreto: out of memory", null);
|
|
432
|
+
};
|
|
433
|
+
plugin.host.exportvalue(inst, PROVIDER_EXPORT, pv.vnum(@floatFromInt(b.made.items.len - 1)));
|
|
434
|
+
},
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
return .{ .name = kind, .define = Gen.define };
|
|
440
|
+
}
|