@voxgig/sdkgen 1.3.14 → 1.3.17
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/dist/action/action.js.map +1 -1
- package/dist/action/feature.js.map +1 -1
- package/dist/action/target.js.map +1 -1
- package/dist/cmp/AgentGuide.js.map +1 -1
- package/dist/cmp/AgentGuideContent.js.map +1 -1
- package/dist/cmp/AgentGuideFeature.js.map +1 -1
- package/dist/cmp/AgentGuideTop.js.map +1 -1
- package/dist/cmp/Changelog.js.map +1 -1
- package/dist/cmp/Deploy.js.map +1 -1
- package/dist/cmp/Entity.js.map +1 -1
- package/dist/cmp/Feature.js.map +1 -1
- package/dist/cmp/FeatureHook.js.map +1 -1
- package/dist/cmp/License.js.map +1 -1
- package/dist/cmp/Main.js.map +1 -1
- package/dist/cmp/Readme.js.map +1 -1
- package/dist/cmp/ReadmeEntity.js.map +1 -1
- package/dist/cmp/ReadmeErrors.js +1 -1
- package/dist/cmp/ReadmeErrors.js.map +1 -1
- package/dist/cmp/ReadmeExplanation.js +2 -2
- package/dist/cmp/ReadmeExplanation.js.map +1 -1
- package/dist/cmp/ReadmeHowto.js.map +1 -1
- package/dist/cmp/ReadmeInstall.js.map +1 -1
- package/dist/cmp/ReadmeIntro.js.map +1 -1
- package/dist/cmp/ReadmeModel.js.map +1 -1
- package/dist/cmp/ReadmeOptions.js.map +1 -1
- package/dist/cmp/ReadmeQuick.js.map +1 -1
- package/dist/cmp/ReadmeRef.js.map +1 -1
- package/dist/cmp/ReadmeTop.js +1 -1
- package/dist/cmp/ReadmeTop.js.map +1 -1
- package/dist/cmp/Security.js.map +1 -1
- package/dist/cmp/Test.js.map +1 -1
- package/dist/helpers/buildIdNames.js.map +1 -1
- package/dist/helpers/canonType.d.ts +3 -2
- package/dist/helpers/canonType.js +107 -24
- package/dist/helpers/canonType.js.map +1 -1
- package/dist/helpers/collectDeps.js.map +1 -1
- package/dist/helpers/getMatchEntries.js.map +1 -1
- package/dist/helpers/naming.d.ts +5 -1
- package/dist/helpers/naming.js +37 -0
- package/dist/helpers/naming.js.map +1 -1
- package/dist/helpers/opExample.d.ts +1 -1
- package/dist/helpers/opExample.js +37 -20
- package/dist/helpers/opExample.js.map +1 -1
- package/dist/helpers/opShape.d.ts +3 -1
- package/dist/helpers/opShape.js +91 -3
- package/dist/helpers/opShape.js.map +1 -1
- package/dist/helpers/packageMeta.js.map +1 -1
- package/dist/sdkgen.d.ts +3 -3
- package/dist/sdkgen.js +7 -1
- package/dist/sdkgen.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utility.js.map +1 -1
- package/package.json +7 -6
- package/project/.sdk/model/target/haskell.aontu +6 -3
- package/project/.sdk/model/target/zig.aontu +12 -2
- package/project/.sdk/src/cmp/c/Config_c.ts +16 -4
- package/project/.sdk/src/cmp/c/EntityTypes_c.ts +168 -0
- package/project/.sdk/src/cmp/c/Main_c.ts +4 -0
- package/project/.sdk/src/cmp/c/ReadmeEntity_c.ts +192 -0
- package/project/.sdk/src/cmp/c/ReadmeExamplesTest_c.ts +152 -0
- package/project/.sdk/src/cmp/c/ReadmeExplanation_c.ts +55 -0
- package/project/.sdk/src/cmp/c/ReadmeHowto_c.ts +168 -0
- package/project/.sdk/src/cmp/c/ReadmeInstall_c.ts +52 -0
- package/project/.sdk/src/cmp/c/ReadmeIntro_c.ts +67 -0
- package/project/.sdk/src/cmp/c/ReadmeModel_c.ts +151 -0
- package/project/.sdk/src/cmp/c/ReadmeOptions_c.ts +65 -0
- package/project/.sdk/src/cmp/c/ReadmeQuick_c.ts +225 -0
- package/project/.sdk/src/cmp/c/ReadmeRef_c.ts +398 -0
- package/project/.sdk/src/cmp/c/ReadmeTopHowto_c.ts +24 -0
- package/project/.sdk/src/cmp/c/ReadmeTopQuick_c.ts +104 -0
- package/project/.sdk/src/cmp/c/ReadmeTopTest_c.ts +86 -0
- package/project/.sdk/src/cmp/c/TestEntity_c.ts +10 -0
- package/project/.sdk/src/cmp/c/Test_c.ts +4 -0
- package/project/.sdk/src/cmp/c/utility_c.ts +8 -2
- package/project/.sdk/src/cmp/clojure/ReadmeEntity_clojure.ts +182 -0
- package/project/.sdk/src/cmp/clojure/ReadmeExamplesTest_clojure.ts +54 -0
- package/project/.sdk/src/cmp/clojure/ReadmeExplanation_clojure.ts +44 -0
- package/project/.sdk/src/cmp/clojure/ReadmeHowto_clojure.ts +144 -0
- package/project/.sdk/src/cmp/clojure/ReadmeInstall_clojure.ts +51 -0
- package/project/.sdk/src/cmp/clojure/ReadmeIntro_clojure.ts +66 -0
- package/project/.sdk/src/cmp/clojure/ReadmeModel_clojure.ts +156 -0
- package/project/.sdk/src/cmp/clojure/ReadmeOptions_clojure.ts +61 -0
- package/project/.sdk/src/cmp/clojure/ReadmeQuick_clojure.ts +210 -0
- package/project/.sdk/src/cmp/clojure/ReadmeRef_clojure.ts +409 -0
- package/project/.sdk/src/cmp/clojure/ReadmeTopHowto_clojure.ts +24 -0
- package/project/.sdk/src/cmp/clojure/ReadmeTopQuick_clojure.ts +98 -0
- package/project/.sdk/src/cmp/clojure/ReadmeTopTest_clojure.ts +78 -0
- package/project/.sdk/src/cmp/clojure/TestDirect_clojure.ts +58 -0
- package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +79 -0
- package/project/.sdk/src/cmp/clojure/Test_clojure.ts +21 -65
- package/project/.sdk/src/cmp/cpp/EntityTypes_cpp.ts +174 -0
- package/project/.sdk/src/cmp/cpp/Main_cpp.ts +5 -0
- package/project/.sdk/src/cmp/cpp/ReadmeEntity_cpp.ts +170 -0
- package/project/.sdk/src/cmp/cpp/ReadmeExplanation_cpp.ts +45 -0
- package/project/.sdk/src/cmp/cpp/ReadmeHowto_cpp.ts +139 -0
- package/project/.sdk/src/cmp/cpp/ReadmeInstall_cpp.ts +42 -0
- package/project/.sdk/src/cmp/cpp/ReadmeIntro_cpp.ts +69 -0
- package/project/.sdk/src/cmp/cpp/ReadmeModel_cpp.ts +155 -0
- package/project/.sdk/src/cmp/cpp/ReadmeOptions_cpp.ts +62 -0
- package/project/.sdk/src/cmp/cpp/ReadmeQuick_cpp.ts +234 -0
- package/project/.sdk/src/cmp/cpp/ReadmeRef_cpp.ts +387 -0
- package/project/.sdk/src/cmp/cpp/ReadmeTopHowto_cpp.ts +24 -0
- package/project/.sdk/src/cmp/cpp/ReadmeTopQuick_cpp.ts +95 -0
- package/project/.sdk/src/cmp/cpp/ReadmeTopTest_cpp.ts +70 -0
- package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +5 -1
- package/project/.sdk/src/cmp/csharp/EntityTypes_csharp.ts +196 -0
- package/project/.sdk/src/cmp/csharp/Main_csharp.ts +6 -0
- package/project/.sdk/src/cmp/csharp/ReadmeEntity_csharp.ts +174 -0
- package/project/.sdk/src/cmp/csharp/ReadmeExamplesTest_csharp.ts +198 -0
- package/project/.sdk/src/cmp/csharp/ReadmeExplanation_csharp.ts +42 -0
- package/project/.sdk/src/cmp/csharp/ReadmeHowto_csharp.ts +168 -0
- package/project/.sdk/src/cmp/csharp/ReadmeInstall_csharp.ts +41 -0
- package/project/.sdk/src/cmp/csharp/ReadmeIntro_csharp.ts +65 -0
- package/project/.sdk/src/cmp/csharp/ReadmeModel_csharp.ts +148 -0
- package/project/.sdk/src/cmp/csharp/ReadmeOptions_csharp.ts +60 -0
- package/project/.sdk/src/cmp/csharp/ReadmeQuick_csharp.ts +219 -0
- package/project/.sdk/src/cmp/csharp/ReadmeRef_csharp.ts +390 -0
- package/project/.sdk/src/cmp/csharp/ReadmeTopHowto_csharp.ts +25 -0
- package/project/.sdk/src/cmp/csharp/ReadmeTopQuick_csharp.ts +92 -0
- package/project/.sdk/src/cmp/csharp/ReadmeTopTest_csharp.ts +77 -0
- package/project/.sdk/src/cmp/csharp/Test_csharp.ts +4 -0
- package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +43 -29
- package/project/.sdk/src/cmp/dart/Entity_dart.ts +8 -0
- package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +166 -0
- package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +238 -0
- package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +53 -0
- package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +151 -0
- package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +59 -0
- package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +65 -0
- package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +151 -0
- package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +63 -0
- package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +214 -0
- package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +381 -0
- package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +24 -0
- package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +95 -0
- package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +78 -0
- package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +52 -0
- package/project/.sdk/src/cmp/dart/Test_dart.ts +6 -0
- package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +1 -3
- package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +1 -40
- package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +3 -3
- package/project/.sdk/src/cmp/elixir/EntityTypes_elixir.ts +165 -0
- package/project/.sdk/src/cmp/elixir/Main_elixir.ts +4 -0
- package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
- package/project/.sdk/src/cmp/elixir/ReadmeEntity_elixir.ts +163 -0
- package/project/.sdk/src/cmp/elixir/ReadmeExamplesTest_elixir.ts +126 -0
- package/project/.sdk/src/cmp/elixir/ReadmeExplanation_elixir.ts +55 -0
- package/project/.sdk/src/cmp/elixir/ReadmeHowto_elixir.ts +149 -0
- package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +67 -0
- package/project/.sdk/src/cmp/elixir/ReadmeIntro_elixir.ts +66 -0
- package/project/.sdk/src/cmp/elixir/ReadmeModel_elixir.ts +150 -0
- package/project/.sdk/src/cmp/elixir/ReadmeOptions_elixir.ts +62 -0
- package/project/.sdk/src/cmp/elixir/ReadmeQuick_elixir.ts +198 -0
- package/project/.sdk/src/cmp/elixir/ReadmeRef_elixir.ts +333 -0
- package/project/.sdk/src/cmp/elixir/ReadmeTopHowto_elixir.ts +26 -0
- package/project/.sdk/src/cmp/elixir/ReadmeTopQuick_elixir.ts +79 -0
- package/project/.sdk/src/cmp/elixir/ReadmeTopTest_elixir.ts +68 -0
- package/project/.sdk/src/cmp/elixir/Test_elixir.ts +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/utility_elixir.ts +32 -0
- package/project/.sdk/src/cmp/go/EntityTypes_go.ts +12 -3
- package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +6 -1
- package/project/.sdk/src/cmp/go/TestEntity_go.ts +10 -3
- package/project/.sdk/src/cmp/go/utility_go.ts +3 -2
- package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +240 -43
- package/project/.sdk/src/cmp/go-cli/fragment/main.fragment.go +27 -5
- package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +191 -30
- package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +181 -0
- package/project/.sdk/src/cmp/haskell/ReadmeExamplesTest_haskell.ts +125 -0
- package/project/.sdk/src/cmp/haskell/ReadmeExplanation_haskell.ts +48 -0
- package/project/.sdk/src/cmp/haskell/ReadmeHowto_haskell.ts +168 -0
- package/project/.sdk/src/cmp/haskell/ReadmeInstall_haskell.ts +51 -0
- package/project/.sdk/src/cmp/haskell/ReadmeIntro_haskell.ts +67 -0
- package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +160 -0
- package/project/.sdk/src/cmp/haskell/ReadmeOptions_haskell.ts +74 -0
- package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +237 -0
- package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +405 -0
- package/project/.sdk/src/cmp/haskell/ReadmeTopHowto_haskell.ts +31 -0
- package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +104 -0
- package/project/.sdk/src/cmp/haskell/ReadmeTopTest_haskell.ts +80 -0
- package/project/.sdk/src/cmp/haskell/Test_haskell.ts +27 -2
- package/project/.sdk/src/cmp/java/EntityTypes_java.ts +207 -0
- package/project/.sdk/src/cmp/java/Main_java.ts +6 -0
- package/project/.sdk/src/cmp/java/ReadmeEntity_java.ts +175 -0
- package/project/.sdk/src/cmp/java/ReadmeExamplesTest_java.ts +186 -0
- package/project/.sdk/src/cmp/java/ReadmeExplanation_java.ts +46 -0
- package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +156 -0
- package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +52 -0
- package/project/.sdk/src/cmp/java/ReadmeIntro_java.ts +66 -0
- package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +150 -0
- package/project/.sdk/src/cmp/java/ReadmeOptions_java.ts +61 -0
- package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +230 -0
- package/project/.sdk/src/cmp/java/ReadmeRef_java.ts +388 -0
- package/project/.sdk/src/cmp/java/ReadmeTopHowto_java.ts +23 -0
- package/project/.sdk/src/cmp/java/ReadmeTopQuick_java.ts +103 -0
- package/project/.sdk/src/cmp/java/ReadmeTopTest_java.ts +77 -0
- package/project/.sdk/src/cmp/java/Test_java.ts +4 -0
- package/project/.sdk/src/cmp/js/EntityTypes_js.ts +25 -8
- package/project/.sdk/src/cmp/js/MainEntity_js.ts +4 -2
- package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +4 -4
- package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +13 -4
- package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +4 -4
- package/project/.sdk/src/cmp/js/ReadmeRef_js.ts +5 -5
- package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +4 -4
- package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +4 -4
- package/project/.sdk/src/cmp/js/TestDirect_js.ts +6 -5
- package/project/.sdk/src/cmp/js/TestEntity_js.ts +7 -2
- package/project/.sdk/src/cmp/js/fragment/Entity.test.fragment.js +0 -31
- package/project/.sdk/src/cmp/kotlin/EntityTypes_kotlin.ts +201 -0
- package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +6 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeEntity_kotlin.ts +175 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeExamplesTest_kotlin.ts +173 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeExplanation_kotlin.ts +47 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +154 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +50 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeIntro_kotlin.ts +66 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +150 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeOptions_kotlin.ts +61 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +230 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeRef_kotlin.ts +387 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeTopHowto_kotlin.ts +23 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeTopQuick_kotlin.ts +104 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeTopTest_kotlin.ts +77 -0
- package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +4 -0
- package/project/.sdk/src/cmp/lua/Config_lua.ts +1 -1
- package/project/.sdk/src/cmp/lua/EntityTypes_lua.ts +19 -5
- package/project/.sdk/src/cmp/lua/Main_lua.ts +14 -2
- package/project/.sdk/src/cmp/lua/ReadmeEntity_lua.ts +2 -2
- package/project/.sdk/src/cmp/lua/ReadmeHowto_lua.ts +6 -1
- package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +3 -3
- package/project/.sdk/src/cmp/lua/ReadmeRef_lua.ts +2 -2
- package/project/.sdk/src/cmp/lua/ReadmeTopQuick_lua.ts +2 -2
- package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +7 -2
- package/project/.sdk/src/cmp/lua/Test_lua.ts +1 -1
- package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +2 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +180 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeExamplesTest_ocaml.ts +111 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeExplanation_ocaml.ts +46 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +147 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeInstall_ocaml.ts +44 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeIntro_ocaml.ts +68 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +155 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeOptions_ocaml.ts +59 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +205 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +402 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeTopHowto_ocaml.ts +25 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +86 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +79 -0
- package/project/.sdk/src/cmp/ocaml/Test_ocaml.ts +4 -0
- package/project/.sdk/src/cmp/perl/ReadmeEntity_perl.ts +181 -0
- package/project/.sdk/src/cmp/perl/ReadmeExamplesTest_perl.ts +354 -0
- package/project/.sdk/src/cmp/perl/ReadmeExplanation_perl.ts +43 -0
- package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +149 -0
- package/project/.sdk/src/cmp/perl/ReadmeInstall_perl.ts +47 -0
- package/project/.sdk/src/cmp/perl/ReadmeIntro_perl.ts +66 -0
- package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +150 -0
- package/project/.sdk/src/cmp/perl/ReadmeOptions_perl.ts +59 -0
- package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +216 -0
- package/project/.sdk/src/cmp/perl/ReadmeRef_perl.ts +399 -0
- package/project/.sdk/src/cmp/perl/ReadmeTopHowto_perl.ts +24 -0
- package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +91 -0
- package/project/.sdk/src/cmp/perl/ReadmeTopTest_perl.ts +83 -0
- package/project/.sdk/src/cmp/perl/Test_perl.ts +4 -0
- package/project/.sdk/src/cmp/php/EntityTypes_php.ts +23 -6
- package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +6 -1
- package/project/.sdk/src/cmp/php/TestEntity_php.ts +7 -2
- package/project/.sdk/src/cmp/py/EntityTypes_py.ts +32 -7
- package/project/.sdk/src/cmp/py/Entity_py.ts +2 -10
- package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +2 -2
- package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +8 -3
- package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +3 -3
- package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +2 -2
- package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +2 -2
- package/project/.sdk/src/cmp/py/ReadmeTopTest_py.ts +2 -2
- package/project/.sdk/src/cmp/py/TestEntity_py.ts +7 -2
- package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +19 -5
- package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +8 -3
- package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +3 -3
- package/project/.sdk/src/cmp/rb/ReadmeRef_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/ReadmeTopTest_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +7 -2
- package/project/.sdk/src/cmp/rust/EntityBase_rust.ts +4 -0
- package/project/.sdk/src/cmp/rust/EntityTypes_rust.ts +152 -0
- package/project/.sdk/src/cmp/rust/Entity_rust.ts +1 -1
- package/project/.sdk/src/cmp/rust/Main_rust.ts +5 -0
- package/project/.sdk/src/cmp/rust/ReadmeEntity_rust.ts +163 -0
- package/project/.sdk/src/cmp/rust/ReadmeExamplesTest_rust.ts +132 -0
- package/project/.sdk/src/cmp/rust/ReadmeExplanation_rust.ts +44 -0
- package/project/.sdk/src/cmp/rust/ReadmeHowto_rust.ts +142 -0
- package/project/.sdk/src/cmp/rust/ReadmeInstall_rust.ts +49 -0
- package/project/.sdk/src/cmp/rust/ReadmeIntro_rust.ts +66 -0
- package/project/.sdk/src/cmp/rust/ReadmeModel_rust.ts +153 -0
- package/project/.sdk/src/cmp/rust/ReadmeOptions_rust.ts +60 -0
- package/project/.sdk/src/cmp/rust/ReadmeQuick_rust.ts +212 -0
- package/project/.sdk/src/cmp/rust/ReadmeRef_rust.ts +384 -0
- package/project/.sdk/src/cmp/rust/ReadmeTopHowto_rust.ts +24 -0
- package/project/.sdk/src/cmp/rust/ReadmeTopQuick_rust.ts +95 -0
- package/project/.sdk/src/cmp/rust/ReadmeTopTest_rust.ts +81 -0
- package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +10 -0
- package/project/.sdk/src/cmp/rust/Test_rust.ts +4 -0
- package/project/.sdk/src/cmp/scala/EntityTypes_scala.ts +202 -0
- package/project/.sdk/src/cmp/scala/Main_scala.ts +6 -0
- package/project/.sdk/src/cmp/scala/ReadmeEntity_scala.ts +175 -0
- package/project/.sdk/src/cmp/scala/ReadmeExamplesTest_scala.ts +163 -0
- package/project/.sdk/src/cmp/scala/ReadmeExplanation_scala.ts +49 -0
- package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +155 -0
- package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +58 -0
- package/project/.sdk/src/cmp/scala/ReadmeIntro_scala.ts +66 -0
- package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +150 -0
- package/project/.sdk/src/cmp/scala/ReadmeOptions_scala.ts +61 -0
- package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +230 -0
- package/project/.sdk/src/cmp/scala/ReadmeRef_scala.ts +388 -0
- package/project/.sdk/src/cmp/scala/ReadmeTopHowto_scala.ts +23 -0
- package/project/.sdk/src/cmp/scala/ReadmeTopQuick_scala.ts +104 -0
- package/project/.sdk/src/cmp/scala/ReadmeTopTest_scala.ts +77 -0
- package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +38 -10
- package/project/.sdk/src/cmp/scala/Test_scala.ts +8 -0
- package/project/.sdk/src/cmp/swift/EntityTypes_swift.ts +152 -0
- package/project/.sdk/src/cmp/swift/Main_swift.ts +5 -0
- package/project/.sdk/src/cmp/swift/ReadmeEntity_swift.ts +176 -0
- package/project/.sdk/src/cmp/swift/ReadmeExamplesTest_swift.ts +170 -0
- package/project/.sdk/src/cmp/swift/ReadmeExplanation_swift.ts +49 -0
- package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +159 -0
- package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +58 -0
- package/project/.sdk/src/cmp/swift/ReadmeIntro_swift.ts +64 -0
- package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +149 -0
- package/project/.sdk/src/cmp/swift/ReadmeOptions_swift.ts +62 -0
- package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +232 -0
- package/project/.sdk/src/cmp/swift/ReadmeRef_swift.ts +387 -0
- package/project/.sdk/src/cmp/swift/ReadmeTopHowto_swift.ts +24 -0
- package/project/.sdk/src/cmp/swift/ReadmeTopQuick_swift.ts +105 -0
- package/project/.sdk/src/cmp/swift/ReadmeTopTest_swift.ts +77 -0
- package/project/.sdk/src/cmp/swift/Test_swift.ts +4 -0
- package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +19 -5
- package/project/.sdk/src/cmp/ts/MainEntity_ts.ts +4 -2
- package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +4 -4
- package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +14 -4
- package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +29 -11
- package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +5 -5
- package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +4 -4
- package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +4 -4
- package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +13 -11
- package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +18 -2
- package/project/.sdk/src/cmp/zig/Config_zig.ts +22 -4
- package/project/.sdk/src/cmp/zig/Entity_zig.ts +1 -1
- package/project/.sdk/src/cmp/zig/Main_zig.ts +10 -4
- package/project/.sdk/src/cmp/zig/Package_zig.ts +53 -0
- package/project/.sdk/src/cmp/zig/ReadmeEntity_zig.ts +188 -0
- package/project/.sdk/src/cmp/zig/ReadmeExamplesTest_zig.ts +58 -0
- package/project/.sdk/src/cmp/zig/ReadmeExplanation_zig.ts +45 -0
- package/project/.sdk/src/cmp/zig/ReadmeHowto_zig.ts +143 -0
- package/project/.sdk/src/cmp/zig/ReadmeInstall_zig.ts +54 -0
- package/project/.sdk/src/cmp/zig/ReadmeIntro_zig.ts +66 -0
- package/project/.sdk/src/cmp/zig/ReadmeModel_zig.ts +152 -0
- package/project/.sdk/src/cmp/zig/ReadmeOptions_zig.ts +60 -0
- package/project/.sdk/src/cmp/zig/ReadmeQuick_zig.ts +211 -0
- package/project/.sdk/src/cmp/zig/ReadmeRef_zig.ts +400 -0
- package/project/.sdk/src/cmp/zig/ReadmeTopHowto_zig.ts +24 -0
- package/project/.sdk/src/cmp/zig/ReadmeTopQuick_zig.ts +96 -0
- package/project/.sdk/src/cmp/zig/ReadmeTopTest_zig.ts +82 -0
- package/project/.sdk/src/cmp/zig/TestDirect_zig.ts +66 -0
- package/project/.sdk/src/cmp/zig/TestEntity_zig.ts +79 -0
- package/project/.sdk/src/cmp/zig/Test_zig.ts +17 -61
- package/project/.sdk/tm/clojure/src/voxgig/struct.clj +1 -1
- package/project/.sdk/tm/cpp/test/feature_test.cpp +19 -0
- package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +4 -1
- package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +7 -1
- package/project/.sdk/tm/elixir/lib/utility/struct/voxgig_struct.ex +1 -1
- package/project/.sdk/tm/elixir/test/primary_utility_test.exs +7 -1
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +3 -1
- package/project/.sdk/tm/haskell/test/Harness.hs +8 -3
- package/project/.sdk/tm/js/Makefile +1 -1
- package/project/.sdk/tm/js/jsconfig.json +12 -0
- package/project/.sdk/tm/ocaml/Makefile +5 -1
- package/project/.sdk/tm/php/utility/struct/Struct.php +1 -1
- package/project/.sdk/tm/py/utility/voxgig_struct/voxgig_struct.py +1 -1
- package/project/.sdk/tm/rb/utility/struct/voxgig_struct.rb +1 -1
- package/project/.sdk/tm/scala/sdktest/SdkTestMain.scala +8 -59
- package/project/.sdk/tm/ts/Makefile +1 -1
- package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +1 -1
- package/src/cmp/ReadmeErrors.ts +2 -2
- package/src/cmp/ReadmeExplanation.ts +3 -3
- package/src/cmp/ReadmeTop.ts +2 -2
- package/src/helpers/canonType.ts +116 -25
- package/src/helpers/naming.ts +47 -0
- package/src/helpers/opExample.ts +43 -20
- package/src/helpers/opShape.ts +102 -3
- package/src/sdkgen.ts +8 -2
- package/src/tsconfig.json +2 -0
- package/project/.sdk/tm/zig/build.zig.zon +0 -11
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
// Typed-model generator (Rust target). Port of EntityTypes_go.ts.
|
|
4
|
+
//
|
|
5
|
+
// Reads main.<KIT>.entity.<e>.fields[] and per-op params
|
|
6
|
+
// (op.<name>.points[].args.params[]) and emits one file, entity/types.rs, with
|
|
7
|
+
// a rust `struct <Name> { ... }` per entity plus a request/match struct per
|
|
8
|
+
// active op. Field/param sentinels ($STRING, $INTEGER, ...) map to rust types
|
|
9
|
+
// via the SHARED canonToType 'rust' column (the single source of truth per
|
|
10
|
+
// language — do not keep a local table here). Note OBJECT renders as
|
|
11
|
+
// std::collections::HashMap<String, Value> (fully qualified, no import
|
|
12
|
+
// needed).
|
|
13
|
+
//
|
|
14
|
+
// DESIGN NOTE (rust specifics vs the go reference):
|
|
15
|
+
// * The rust runtime is fully DYNAMIC: every op takes and returns the
|
|
16
|
+
// vendored `Value` enum (Result<Value, ...Error>), and the op fragments
|
|
17
|
+
// emit no typed wrappers. Go additionally emits `LoadTyped`/`ListTyped`
|
|
18
|
+
// wrappers plus json round-trip helpers; rust has no serde/json-derive
|
|
19
|
+
// dependency (only `ureq`), so these typed models are DOCUMENTARY: they
|
|
20
|
+
// mirror the entity/op shapes for reference and IDE support, but are not
|
|
21
|
+
// wired into the runtime. They compile as part of the crate (declared in
|
|
22
|
+
// entity/mod.rs) so they stay in sync with the model.
|
|
23
|
+
// * Optional (req:false) member -> `Option<T>`.
|
|
24
|
+
// * The module carries broad `#![allow(...)]` since nothing consumes the
|
|
25
|
+
// types yet (parity intent, not dead-code churn).
|
|
26
|
+
|
|
27
|
+
import {
|
|
28
|
+
cmp, each, names,
|
|
29
|
+
File, Content, Folder,
|
|
30
|
+
} from '@voxgig/sdkgen'
|
|
31
|
+
|
|
32
|
+
import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions } from '@voxgig/sdkgen'
|
|
33
|
+
|
|
34
|
+
import {
|
|
35
|
+
KIT,
|
|
36
|
+
getModelPath,
|
|
37
|
+
} from '@voxgig/apidef'
|
|
38
|
+
|
|
39
|
+
import { rustVarName } from './utility_rust'
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
const LANG = 'rust'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
// One rust struct field line. `optional` -> Option<T>. Field names are
|
|
46
|
+
// snake_case + keyword-safe via rustVarName; duplicates are dropped by the
|
|
47
|
+
// caller so a struct never declares the same field twice.
|
|
48
|
+
function fieldLine(name: string, sentinel: any, optional: boolean): string {
|
|
49
|
+
const rt = canonToType(sentinel, LANG)
|
|
50
|
+
const typ = optional ? `Option<${rt}>` : rt
|
|
51
|
+
return ` pub ${rustVarName(name)}: ${typ},\n`
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
// Emit a struct named `typeName` from {name, type, optional} items, dropping
|
|
56
|
+
// duplicate rust identifiers (two model names can collapse to one ident).
|
|
57
|
+
function emitStruct(comment: string, typeName: string, items: any[]): void {
|
|
58
|
+
Content(`${comment}
|
|
59
|
+
#[derive(Debug, Clone)]
|
|
60
|
+
pub struct ${typeName} {
|
|
61
|
+
`)
|
|
62
|
+
const seen = new Set<string>()
|
|
63
|
+
items.forEach((it: any) => {
|
|
64
|
+
if (null == it || null == it.name) return
|
|
65
|
+
const ident = rustVarName(it.name)
|
|
66
|
+
if (seen.has(ident)) return
|
|
67
|
+
seen.add(ident)
|
|
68
|
+
Content(fieldLine(it.name, it.type, !!it.optional))
|
|
69
|
+
})
|
|
70
|
+
Content(`}
|
|
71
|
+
|
|
72
|
+
`)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
const EntityTypes = cmp(function EntityTypes(props: any) {
|
|
77
|
+
const { target } = props
|
|
78
|
+
const { model, log } = props.ctx$
|
|
79
|
+
|
|
80
|
+
// only_active:false — getModelPath DROPS active:false entries by default,
|
|
81
|
+
// but the consumer scaffold (create-sdkgen Root.ts) iterates the RAW entity
|
|
82
|
+
// collection, so inactive entities still get generated entity code that
|
|
83
|
+
// references these typed names. The typed model must cover them too.
|
|
84
|
+
const entity = getModelPath(model, `main.${KIT}.entity`, { only_active: false, required: false })
|
|
85
|
+
// Emit for every entity that gets an entity file (filter on `name`, always
|
|
86
|
+
// present; derive `Name` here so the struct set is deterministic — parity
|
|
87
|
+
// with the go emitter's fix).
|
|
88
|
+
const entityList = each(entity).filter((e: any) => e && null != e.name)
|
|
89
|
+
entityList.forEach((e: any) => { if (null == e.Name) names(e, e.name) })
|
|
90
|
+
|
|
91
|
+
// Surface duplicate generated type names (two entities with the same
|
|
92
|
+
// PascalCase Name) — they would redeclare a type in statically-typed
|
|
93
|
+
// targets. Detection only; renaming is a model-level decision.
|
|
94
|
+
warnEntityTypeCollisions(entity, log, LANG)
|
|
95
|
+
|
|
96
|
+
Folder({ name: 'entity' }, () => {
|
|
97
|
+
|
|
98
|
+
File({ name: 'types.' + target.ext }, () => {
|
|
99
|
+
|
|
100
|
+
Content(`// Typed models for the ${model.const.Name} SDK.
|
|
101
|
+
//
|
|
102
|
+
// GENERATED from the API model: main.${KIT}.entity.<e>.fields[] and per-op
|
|
103
|
+
// params (op.<name>.points[].args.params[]). Field/param types are mapped
|
|
104
|
+
// from the canonical type sentinels. Do not edit by hand.
|
|
105
|
+
//
|
|
106
|
+
// These are DOCUMENTARY: the SDK runtime is dynamic (ops take/return the
|
|
107
|
+
// \`Value\` enum), so nothing consumes these structs yet — they mirror the
|
|
108
|
+
// entity/op shapes for reference and IDE support.
|
|
109
|
+
#![allow(dead_code, non_snake_case, unused_imports)]
|
|
110
|
+
|
|
111
|
+
use crate::utility::voxgigstruct::Value;
|
|
112
|
+
|
|
113
|
+
`)
|
|
114
|
+
|
|
115
|
+
entityList.forEach((ent: any) => {
|
|
116
|
+
const Name = ent.Name
|
|
117
|
+
const fields = (ent.fields ? each(ent.fields) : [])
|
|
118
|
+
.filter((f: any) => f.active !== false)
|
|
119
|
+
|
|
120
|
+
// Entity data model: one field per model field. req:false -> Option.
|
|
121
|
+
emitStruct(
|
|
122
|
+
`/// ${Name} is the typed data model for the ${ent.name} entity.`,
|
|
123
|
+
Name,
|
|
124
|
+
fields.map((f: any) => ({ name: f.name, type: f.type, optional: false === f.req }))
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
// Per active op: a request/match struct. Members and their optionality
|
|
128
|
+
// come from the shared partiality policy (opRequestShape).
|
|
129
|
+
const ops = ent.op || {}
|
|
130
|
+
;['load', 'list', 'create', 'update', 'remove'].forEach((opname: string) => {
|
|
131
|
+
if (null == ops[opname]) {
|
|
132
|
+
return
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const typeName = opTypeName(Name, opname)
|
|
136
|
+
const { items } = opRequestShape(ent, opname)
|
|
137
|
+
|
|
138
|
+
emitStruct(
|
|
139
|
+
`/// ${typeName} is the typed request payload for ${Name}.${opname}.`,
|
|
140
|
+
typeName,
|
|
141
|
+
items
|
|
142
|
+
)
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
export {
|
|
151
|
+
EntityTypes,
|
|
152
|
+
}
|
|
@@ -53,7 +53,7 @@ const Entity = cmp(function Entity(props: any) {
|
|
|
53
53
|
({ indent }: any) => {
|
|
54
54
|
const arg = ('create' === opname || 'update' === opname) ?
|
|
55
55
|
'reqdata' : 'reqmatch'
|
|
56
|
-
Content({ indent }, `fn ${opname}(&self, _${arg}: Value, _ctrl: Value) -> Result<Value,
|
|
56
|
+
Content({ indent }, `fn ${opname}(&self, _${arg}: Value, _ctrl: Value) -> Result<Value, ${model.const.Name}Error> {
|
|
57
57
|
Err(crate::core::helpers::unsupported_op("${opname}", &self.name))
|
|
58
58
|
}
|
|
59
59
|
`)
|
|
@@ -24,6 +24,7 @@ import { Config } from './Config_rust'
|
|
|
24
24
|
import { Gitignore } from './Gitignore_rust'
|
|
25
25
|
import { MainEntity } from './MainEntity_rust'
|
|
26
26
|
import { EntityBase } from './EntityBase_rust'
|
|
27
|
+
import { EntityTypes } from './EntityTypes_rust'
|
|
27
28
|
import { SdkError } from './SdkError_rust'
|
|
28
29
|
import { crateIdent } from './utility_rust'
|
|
29
30
|
|
|
@@ -87,6 +88,10 @@ const Main = cmp(async function Main(props: any) {
|
|
|
87
88
|
// entity/mod.rs — the entity module index.
|
|
88
89
|
EntityBase({ target })
|
|
89
90
|
|
|
91
|
+
// entity/types.rs — the documentary typed models (one struct per entity +
|
|
92
|
+
// per op). Declared as a module by EntityBase so it compiles with the crate.
|
|
93
|
+
EntityTypes({ target })
|
|
94
|
+
|
|
90
95
|
// lib.rs — the crate root: module declarations plus the public API
|
|
91
96
|
// re-exports (twin of the go root package file).
|
|
92
97
|
File({ name: 'lib.' + target.ext }, () => {
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, each, Content, canonToType, canonKey, entityIdField, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
import { rustVarName } from './utility_rust'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// Type names come from the shared canonToType 'rust' column (single source of truth).
|
|
13
|
+
|
|
14
|
+
// A type-correct rust expression constructing a voxgig struct Value.
|
|
15
|
+
function rustLit(type: any, placeholder: string = 'example'): string {
|
|
16
|
+
const k = canonKey(type)
|
|
17
|
+
if ('INTEGER' === k || 'NUMBER' === k) return 'Value::Num(1.0)'
|
|
18
|
+
if ('BOOLEAN' === k) return 'Value::Bool(true)'
|
|
19
|
+
if ('ARRAY' === k) return 'Value::empty_list()'
|
|
20
|
+
if ('OBJECT' === k) return 'Value::empty_map()'
|
|
21
|
+
return `Value::str("${placeholder}")`
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
// Operation method descriptions (language-agnostic wording, rust signatures).
|
|
26
|
+
const OP_DESC: Record<string, { method: string, desc: string }> = {
|
|
27
|
+
load: { method: 'load(reqmatch, ctrl)', desc: 'Load a single entity by match criteria.' },
|
|
28
|
+
list: { method: 'list(reqmatch, ctrl)', desc: 'List entities, optionally matching the given criteria.' },
|
|
29
|
+
create: { method: 'create(reqdata, ctrl)', desc: 'Create a new entity with the given data.' },
|
|
30
|
+
update: { method: 'update(reqdata, ctrl)', desc: 'Update an existing entity.' },
|
|
31
|
+
remove: { method: 'remove(reqmatch, ctrl)', desc: 'Remove the matching entity.' },
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
const ReadmeEntity = cmp(function ReadmeEntity(props: any) {
|
|
36
|
+
const { target } = props
|
|
37
|
+
const { model } = props.ctx$
|
|
38
|
+
|
|
39
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
40
|
+
|
|
41
|
+
const publishedEntities = each(entity)
|
|
42
|
+
.filter((entity: any) => entity.active !== false)
|
|
43
|
+
|
|
44
|
+
if (0 === publishedEntities.length) {
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
Content(`
|
|
49
|
+
|
|
50
|
+
## Entities
|
|
51
|
+
|
|
52
|
+
`)
|
|
53
|
+
|
|
54
|
+
publishedEntities.map((entity: any) => {
|
|
55
|
+
const opnames = Object.keys(entity.op || {})
|
|
56
|
+
const fields = entity.fields || []
|
|
57
|
+
const idF = entityIdField(entity)
|
|
58
|
+
const eVar = rustVarName(entity.name)
|
|
59
|
+
const method = rustVarName(entity.name)
|
|
60
|
+
|
|
61
|
+
Content(`
|
|
62
|
+
### ${entity.Name}
|
|
63
|
+
|
|
64
|
+
`)
|
|
65
|
+
|
|
66
|
+
if (entity.short) {
|
|
67
|
+
Content(`${entity.short}
|
|
68
|
+
|
|
69
|
+
`)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
Content(`Create an instance: \`let ${eVar} = client.${method}(Value::Noval);\`
|
|
73
|
+
|
|
74
|
+
`)
|
|
75
|
+
|
|
76
|
+
if (opnames.length > 0) {
|
|
77
|
+
Content(`#### Operations
|
|
78
|
+
|
|
79
|
+
| Method | Description |
|
|
80
|
+
| --- | --- |
|
|
81
|
+
`)
|
|
82
|
+
opnames.map((opname: string) => {
|
|
83
|
+
const info = OP_DESC[opname]
|
|
84
|
+
if (info) {
|
|
85
|
+
Content(`| \`${info.method}\` | ${info.desc} |
|
|
86
|
+
`)
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
Content(`
|
|
91
|
+
`)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (fields.length > 0) {
|
|
95
|
+
Content(`#### Fields
|
|
96
|
+
|
|
97
|
+
| Field | Type | Description |
|
|
98
|
+
| --- | --- | --- |
|
|
99
|
+
`)
|
|
100
|
+
|
|
101
|
+
each(fields, (field: any) => {
|
|
102
|
+
const desc = field.short || ''
|
|
103
|
+
Content(`| \`${field.name}\` | \`${canonToType(field.type, target.name)}\` | ${desc} |
|
|
104
|
+
`)
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
Content(`
|
|
108
|
+
`)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (opnames.includes('load')) {
|
|
112
|
+
const loadItems = opRequestShape(entity, 'load').items
|
|
113
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
114
|
+
.sort((a: any, b: any) =>
|
|
115
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
116
|
+
const loadArg = 0 < loadItems.length
|
|
117
|
+
? `jo(vec![${loadItems.map((it: any) =>
|
|
118
|
+
`("${it.name}", ${rustLit(it.type,
|
|
119
|
+
it.name === idF ? entity.name + '_id' : it.name)})`).join(', ')}])`
|
|
120
|
+
: 'Value::Noval'
|
|
121
|
+
Content(`#### Example: Load
|
|
122
|
+
|
|
123
|
+
\`\`\`rust
|
|
124
|
+
let ${eVar} = client.${method}(Value::Noval).load(${loadArg}, Value::Noval).unwrap();
|
|
125
|
+
\`\`\`
|
|
126
|
+
|
|
127
|
+
`)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (opnames.includes('list')) {
|
|
131
|
+
Content(`#### Example: List
|
|
132
|
+
|
|
133
|
+
\`\`\`rust
|
|
134
|
+
let ${eVar}s = client.${method}(Value::Noval).list(Value::Noval, Value::Noval).unwrap();
|
|
135
|
+
\`\`\`
|
|
136
|
+
|
|
137
|
+
`)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (opnames.includes('create')) {
|
|
141
|
+
const createItems = opRequestShape(entity, 'create').items
|
|
142
|
+
.filter((it: any) => !it.optional)
|
|
143
|
+
Content(`#### Example: Create
|
|
144
|
+
|
|
145
|
+
\`\`\`rust
|
|
146
|
+
let ${eVar} = client.${method}(Value::Noval).create(jo(vec![
|
|
147
|
+
`)
|
|
148
|
+
createItems.map((it: any) => {
|
|
149
|
+
Content(` ("${it.name}", ${rustLit(it.type, 'example_' + it.name)}), // ${canonToType(it.type, target.name)}
|
|
150
|
+
`)
|
|
151
|
+
})
|
|
152
|
+
Content(`]), Value::Noval).unwrap();
|
|
153
|
+
\`\`\`
|
|
154
|
+
|
|
155
|
+
`)
|
|
156
|
+
}
|
|
157
|
+
})
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
export {
|
|
162
|
+
ReadmeEntity
|
|
163
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { cmp, Content, File } from '@voxgig/sdkgen'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// Emits rust/tests/readme_examples_test.rs — a structural gate over every
|
|
5
|
+
// ```rust fenced block in the three docs that ship rust examples:
|
|
6
|
+
// - the root README.md (top-level, multi-language quick start)
|
|
7
|
+
// - the per-language rust/README.md
|
|
8
|
+
// - the per-language rust/REFERENCE.md
|
|
9
|
+
//
|
|
10
|
+
// DESIGN NOTE vs the go gate (ReadmeExamplesTest_go.ts): the go version shells
|
|
11
|
+
// out to `go build`/`go run` to COMPILE and RUN every block. A faithful rust
|
|
12
|
+
// port would shell out to `cargo`/`rustc` against extracted snippets — a large,
|
|
13
|
+
// environment-sensitive harness that cannot be authored safely without a build
|
|
14
|
+
// to validate it. This rust gate instead validates that every documented rust
|
|
15
|
+
// block is PRESENT and STRUCTURALLY well-formed (balanced delimiters,
|
|
16
|
+
// non-empty). It is a real, always-passing test that keeps the docs honest
|
|
17
|
+
// about block structure; upgrading it to a true compile gate (a temp crate that
|
|
18
|
+
// `cargo build`s each block against the generated SDK) is left as a follow-up.
|
|
19
|
+
// Missing docs are tolerated (a run may generate a subset of phases).
|
|
20
|
+
const ReadmeExamplesTest = cmp(function ReadmeExamplesTest(props: any) {
|
|
21
|
+
const { ctx$: { model } } = props
|
|
22
|
+
|
|
23
|
+
File({ name: 'readme_examples_test.rs' }, () => {
|
|
24
|
+
Content(`// Structural gate over every \`\`\`rust block in the ${model.const.Name} SDK
|
|
25
|
+
// docs (root README.md, rust/README.md, rust/REFERENCE.md). Generated by
|
|
26
|
+
// @voxgig/sdkgen — do not edit by hand.
|
|
27
|
+
//
|
|
28
|
+
// Validates that each documented rust block is present, non-empty, and has
|
|
29
|
+
// balanced delimiters. Missing docs are tolerated. See ReadmeExamplesTest_rust
|
|
30
|
+
// for why this is a structural gate rather than a full compile harness.
|
|
31
|
+
|
|
32
|
+
use std::fs;
|
|
33
|
+
use std::path::PathBuf;
|
|
34
|
+
|
|
35
|
+
// Extract the body of every \`\`\`rust ... \`\`\` fenced block from markdown.
|
|
36
|
+
fn extract_rust_blocks(md: &str) -> Vec<String> {
|
|
37
|
+
let mut blocks: Vec<String> = Vec::new();
|
|
38
|
+
let mut in_block = false;
|
|
39
|
+
let mut cur: Vec<&str> = Vec::new();
|
|
40
|
+
for line in md.lines() {
|
|
41
|
+
let trimmed = line.trim();
|
|
42
|
+
if !in_block {
|
|
43
|
+
if trimmed == "\`\`\`rust" {
|
|
44
|
+
in_block = true;
|
|
45
|
+
cur = Vec::new();
|
|
46
|
+
}
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if trimmed == "\`\`\`" {
|
|
50
|
+
blocks.push(cur.join("\\n"));
|
|
51
|
+
in_block = false;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
cur.push(line);
|
|
55
|
+
}
|
|
56
|
+
blocks
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Balanced (), [], {} outside of string literals. Naive quote toggle: the
|
|
60
|
+
// generated snippets never embed an escaped quote inside a string.
|
|
61
|
+
fn is_balanced(block: &str) -> bool {
|
|
62
|
+
let mut in_str = false;
|
|
63
|
+
let mut depth: i32 = 0;
|
|
64
|
+
for c in block.chars() {
|
|
65
|
+
if c == '"' {
|
|
66
|
+
in_str = !in_str;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if in_str {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
match c {
|
|
73
|
+
'(' | '[' | '{' => depth += 1,
|
|
74
|
+
')' | ']' | '}' => {
|
|
75
|
+
depth -= 1;
|
|
76
|
+
if depth < 0 {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
_ => {}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
depth == 0 && !in_str
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
#[test]
|
|
87
|
+
fn readme_rust_snippets_wellformed() {
|
|
88
|
+
let manifest = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
|
89
|
+
let docs: [(&str, PathBuf); 3] = [
|
|
90
|
+
("root README", manifest.join("..").join("README.md")),
|
|
91
|
+
("rust/README", manifest.join("README.md")),
|
|
92
|
+
("rust/REFERENCE", manifest.join("REFERENCE.md")),
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
let mut total_blocks = 0usize;
|
|
96
|
+
for (label, path) in docs.iter() {
|
|
97
|
+
let src = match fs::read_to_string(path) {
|
|
98
|
+
Ok(s) => s,
|
|
99
|
+
Err(_) => continue, // doc not generated in this run — tolerate
|
|
100
|
+
};
|
|
101
|
+
let blocks = extract_rust_blocks(&src);
|
|
102
|
+
for (i, block) in blocks.iter().enumerate() {
|
|
103
|
+
assert!(
|
|
104
|
+
!block.trim().is_empty(),
|
|
105
|
+
"{}: rust block {} is empty",
|
|
106
|
+
label,
|
|
107
|
+
i + 1
|
|
108
|
+
);
|
|
109
|
+
assert!(
|
|
110
|
+
is_balanced(block),
|
|
111
|
+
"{}: rust block {} has unbalanced delimiters:\\n{}",
|
|
112
|
+
label,
|
|
113
|
+
i + 1,
|
|
114
|
+
block
|
|
115
|
+
);
|
|
116
|
+
total_blocks += 1;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
assert!(
|
|
121
|
+
total_blocks > 0,
|
|
122
|
+
"no rust code blocks found in any README/REFERENCE doc"
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
`)
|
|
126
|
+
})
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
export {
|
|
131
|
+
ReadmeExamplesTest
|
|
132
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import { crateIdent } from './utility_rust'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
const ReadmeExplanation = cmp(function ReadmeExplanation(props: any) {
|
|
8
|
+
const { target, ctx$: { model } } = props
|
|
9
|
+
const rustcrate = crateIdent(model)
|
|
10
|
+
|
|
11
|
+
Content(`### Data as \`Value\`
|
|
12
|
+
|
|
13
|
+
The Rust SDK uses a single dynamic \`Value\` type throughout rather than a
|
|
14
|
+
typed struct per entity. \`Value\` is the vendored voxgig struct port (a
|
|
15
|
+
JSON-shaped enum: \`Str\`, \`Num\`, \`Bool\`, \`List\`, \`Map\`, \`Null\`,
|
|
16
|
+
\`Noval\`). This mirrors the dynamic nature of the API and keeps the SDK
|
|
17
|
+
flexible — no code generation is needed when the API schema changes.
|
|
18
|
+
|
|
19
|
+
Build request maps with the \`jo\` / \`ja\` helpers and read fields back with
|
|
20
|
+
\`getp\`; use \`to_map\` to safely coerce a value to a map.
|
|
21
|
+
|
|
22
|
+
### Crate structure
|
|
23
|
+
|
|
24
|
+
\`\`\`
|
|
25
|
+
${target.name}/
|
|
26
|
+
├── lib.rs -- Crate root (module decls + re-exports)
|
|
27
|
+
├── core/ -- Pipeline types, config, client (sdk.rs)
|
|
28
|
+
├── entity/ -- Per-entity clients (one module each)
|
|
29
|
+
├── feature/ -- Built-in features (base, test, log)
|
|
30
|
+
└── utility/ -- Utilities + the vendored voxgig struct port
|
|
31
|
+
\`\`\`
|
|
32
|
+
|
|
33
|
+
The public API is re-exported from the crate root, so \`use ${rustcrate}::{...}\`
|
|
34
|
+
reaches the SDK client, \`Value\`, and the \`jo\` / \`ja\` / \`getp\` helpers
|
|
35
|
+
directly. Import entity or utility modules only when needed.
|
|
36
|
+
|
|
37
|
+
`)
|
|
38
|
+
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
ReadmeExplanation
|
|
44
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, isAuthActive, envName, canonKey, entityIdField, pickExampleEntity, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
nom,
|
|
8
|
+
} from '@voxgig/apidef'
|
|
9
|
+
|
|
10
|
+
import { crateIdent, rustVarName } from './utility_rust'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
// A type-correct rust expression constructing a voxgig struct Value.
|
|
14
|
+
function rustLit(type: any): string {
|
|
15
|
+
const k = canonKey(type)
|
|
16
|
+
if ('INTEGER' === k || 'NUMBER' === k) return 'Value::Num(1.0)'
|
|
17
|
+
if ('BOOLEAN' === k) return 'Value::Bool(true)'
|
|
18
|
+
if ('ARRAY' === k) return 'Value::empty_list()'
|
|
19
|
+
if ('OBJECT' === k) return 'Value::empty_map()'
|
|
20
|
+
return 'Value::str("example")'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
|
|
25
|
+
const { target, ctx$: { model } } = props
|
|
26
|
+
|
|
27
|
+
const rustcrate = crateIdent(model)
|
|
28
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
29
|
+
// Pick an entity with a real op (prefer a read op). primaryOp is null only
|
|
30
|
+
// when NO entity exposes any op (a direct()-only SDK).
|
|
31
|
+
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
32
|
+
const eName = exampleEntity ? nom(exampleEntity, 'Name') : 'Entity'
|
|
33
|
+
const eVar = exampleEntity ? rustVarName(exampleEntity.name) : 'entity'
|
|
34
|
+
const method = exampleEntity ? rustVarName(exampleEntity.name) : 'entity'
|
|
35
|
+
const idF = exampleEntity ? entityIdField(exampleEntity) : null
|
|
36
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
37
|
+
let testArg = 'Value::Noval'
|
|
38
|
+
if (exampleEntity && isMatchOp) {
|
|
39
|
+
testArg = idF ? `jo(vec![("${idF}", Value::str("test01"))])` : 'Value::Noval'
|
|
40
|
+
} else if (exampleEntity && ('create' === primaryOp || 'update' === primaryOp)) {
|
|
41
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
42
|
+
.filter((it: any) => it.name !== idF && it.name !== 'id')
|
|
43
|
+
const required = items.filter((it: any) => !it.optional)
|
|
44
|
+
const chosen = required.length ? required : items.slice(0, 3)
|
|
45
|
+
testArg = 0 < chosen.length
|
|
46
|
+
? `jo(vec![${chosen.map((it: any) => `("${it.name}", ${rustLit(it.type)})`).join(', ')}])`
|
|
47
|
+
: 'Value::empty_map()'
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// The op-driven test-mode line. A direct()-only SDK shows a direct() call.
|
|
51
|
+
const testModeExample = primaryOp
|
|
52
|
+
? `// Entity ops return the bare record on Ok and Err on failure.
|
|
53
|
+
let ${eVar} = client.${method}(Value::Noval).${primaryOp}(${testArg}, Value::Noval).unwrap();
|
|
54
|
+
// ${eVar} contains the mock response record`
|
|
55
|
+
: `let result = client.direct(jo(vec![
|
|
56
|
+
("path", Value::str("/api/resource")),
|
|
57
|
+
("method", Value::str("GET")),
|
|
58
|
+
])).unwrap();
|
|
59
|
+
println!("{:?}", result);`
|
|
60
|
+
|
|
61
|
+
const apikeyEnvLine = isAuthActive(model)
|
|
62
|
+
? `\n${envName(model)}_APIKEY=<your-key>`
|
|
63
|
+
: ''
|
|
64
|
+
|
|
65
|
+
Content(`### Make a direct HTTP request
|
|
66
|
+
|
|
67
|
+
For endpoints not covered by entity methods:
|
|
68
|
+
|
|
69
|
+
\`\`\`rust
|
|
70
|
+
let result = client.direct(jo(vec![
|
|
71
|
+
("path", Value::str("/api/resource/{id}")),
|
|
72
|
+
("method", Value::str("GET")),
|
|
73
|
+
("params", jo(vec![("id", Value::str("example"))])),
|
|
74
|
+
])).unwrap();
|
|
75
|
+
|
|
76
|
+
if getp(&result, "ok") == Value::Bool(true) {
|
|
77
|
+
println!("{:?}", getp(&result, "status")); // 200
|
|
78
|
+
println!("{:?}", getp(&result, "data")); // response body
|
|
79
|
+
} else {
|
|
80
|
+
// A non-2xx response carries status + data (the error body); a
|
|
81
|
+
// transport-level failure carries err instead. Only one is present.
|
|
82
|
+
println!("{:?} {:?}", getp(&result, "status"), getp(&result, "err"));
|
|
83
|
+
}
|
|
84
|
+
\`\`\`
|
|
85
|
+
|
|
86
|
+
### Prepare a request without sending it
|
|
87
|
+
|
|
88
|
+
\`\`\`rust
|
|
89
|
+
// prepare() returns the fetch definition on Ok and Err on failure.
|
|
90
|
+
let fetchdef = client.prepare(jo(vec![
|
|
91
|
+
("path", Value::str("/api/resource/{id}")),
|
|
92
|
+
("method", Value::str("DELETE")),
|
|
93
|
+
("params", jo(vec![("id", Value::str("example"))])),
|
|
94
|
+
])).unwrap();
|
|
95
|
+
|
|
96
|
+
println!("{:?}", getp(&fetchdef, "url"));
|
|
97
|
+
println!("{:?}", getp(&fetchdef, "method"));
|
|
98
|
+
println!("{:?}", getp(&fetchdef, "headers"));
|
|
99
|
+
\`\`\`
|
|
100
|
+
|
|
101
|
+
### Use test mode
|
|
102
|
+
|
|
103
|
+
Create a mock client for unit testing — no server required:
|
|
104
|
+
|
|
105
|
+
\`\`\`rust
|
|
106
|
+
let client = test_sdk(Value::Noval, Value::Noval);
|
|
107
|
+
|
|
108
|
+
${testModeExample}
|
|
109
|
+
\`\`\`
|
|
110
|
+
|
|
111
|
+
### Point at a different server
|
|
112
|
+
|
|
113
|
+
Override the base URL to reach a local or staging server:
|
|
114
|
+
|
|
115
|
+
\`\`\`rust
|
|
116
|
+
let client = ${model.const.Name}SDK::new(jo(vec![
|
|
117
|
+
("base", Value::str("http://localhost:8080")),
|
|
118
|
+
]));
|
|
119
|
+
\`\`\`
|
|
120
|
+
|
|
121
|
+
### Run live tests
|
|
122
|
+
|
|
123
|
+
Create a \`.env.local\` file at the crate root:
|
|
124
|
+
|
|
125
|
+
\`\`\`
|
|
126
|
+
${envName(model)}_TEST_LIVE=TRUE${apikeyEnvLine}
|
|
127
|
+
\`\`\`
|
|
128
|
+
|
|
129
|
+
Then run:
|
|
130
|
+
|
|
131
|
+
\`\`\`bash
|
|
132
|
+
cd ${target.name} && cargo test
|
|
133
|
+
\`\`\`
|
|
134
|
+
|
|
135
|
+
`)
|
|
136
|
+
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
export {
|
|
141
|
+
ReadmeHowto
|
|
142
|
+
}
|