diff --git a/.bazelignore b/.bazelignore new file mode 100644 index 00000000..56be2a99 --- /dev/null +++ b/.bazelignore @@ -0,0 +1,3 @@ +# The out-of-tree consumer example is its own Bazel module (CI builds it +# standalone); keep it out of this workspace's target graph. +examples/bazel-consumer diff --git a/.bazelrc b/.bazelrc index 98f27c44..c6e32411 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,11 +1,6 @@ # Platform-specific configs (build:linux / build:macos / build:windows) apply automatically. common --enable_platform_specific_config -# Bazel 9 removed the native C++ rules; autoload them from rules_cc for third-party -# BUILD files (e.g. googletest) that don't load() them yet. Our own BUILD files -# always load from @rules_cc explicitly. -common --incompatible_autoload_externally=+cc_library,+cc_binary,+cc_test,+cc_import - # C++20 everywhere (ADR-0003 baseline; see docs/PLAN.md §2). build:linux --cxxopt=-std=c++20 --host_cxxopt=-std=c++20 build:macos --cxxopt=-std=c++20 --host_cxxopt=-std=c++20 @@ -36,3 +31,10 @@ build:ci --announce_rc --verbose_failures # Personal overrides stay out of version control. try-import %workspace%/.bazelrc.user + +# The code generator is Java 17 (matching the Gradle toolchain); rules_java +# compiles and runs it on a hermetic remote JDK. +common --java_language_version=17 +common --tool_java_language_version=17 +common --java_runtime_version=remotejdk_17 +common --tool_java_runtime_version=remotejdk_17 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1d5bca2..5968b4e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,18 @@ jobs: CXX: clang++ run: bazelisk test //... --config=ci --config=asan --config=ubsan + consumer: + name: bazel consumer (quick start) + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + # The quick-start acceptance test (docs/quickstart.md): a standalone + # out-of-tree Bazel module consumes smithy_cpp via the rules in + # bazel/defs.bzl — generation runs inside the consumer's build graph. + - name: bazel test (out-of-tree module) + working-directory: examples/bazel-consumer + run: bazelisk test //... --verbose_failures + codegen: name: codegen (gradle) runs-on: ubuntu-24.04 diff --git a/.gitignore b/.gitignore index 441c1b91..20ebe21b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # Bazel -bazel-* +/bazel-* /.bazelrc.user # Gradle / JVM diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 00000000..e42c8c53 --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,2 @@ +# Root package: hosts the rules_jvm_external lock file (//:maven_install.json). +exports_files(["maven_install.json"]) diff --git a/MODULE.bazel b/MODULE.bazel index 60a3985e..23868073 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -6,7 +6,38 @@ module( bazel_dep(name = "platforms", version = "1.0.0") bazel_dep(name = "rules_cc", version = "0.2.17") -bazel_dep(name = "googletest", version = "1.17.0.bcr.1") +bazel_dep(name = "googletest", version = "1.17.0.bcr.2") bazel_dep(name = "boost.asio", version = "1.87.0.bcr.1") bazel_dep(name = "boost.beast", version = "1.87.0") -bazel_dep(name = "nlohmann_json", version = "3.12.0") +bazel_dep(name = "nlohmann_json", version = "3.12.0.bcr.1") + +# boost.container 1.87's registry overlay calls native.cc_test without a +# load(), the one stale file in the boost 1.87 graph (audited); patch it +# rather than moving to boost 1.90, which drags in boringssl toolchains. +single_version_override( + module_name = "boost.container", + patch_strip = 1, + patches = ["//third_party:boost_container_cc_test_load.patch"], +) + +bazel_dep(name = "rules_testing", version = "0.6.0", dev_dependency = True) + +# The code generator runs inside the build graph as a hermetic Java action +# (bazel/defs.bzl); rules_jvm_external pins its Smithy dependencies. +bazel_dep(name = "rules_java", version = "8.16.1") +bazel_dep(name = "rules_jvm_external", version = "6.7") + +maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven") +maven.install( + name = "smithy_cpp_codegen_maven", + artifacts = [ + "software.amazon.smithy:smithy-aws-traits:1.53.0", + "software.amazon.smithy:smithy-build:1.53.0", + "software.amazon.smithy:smithy-codegen-core:1.53.0", + "software.amazon.smithy:smithy-protocol-test-traits:1.53.0", + "software.amazon.smithy:smithy-protocol-traits:1.53.0", + ], + lock_file = "//:maven_install.json", + repositories = ["https://repo1.maven.org/maven2"], +) +use_repo(maven, "smithy_cpp_codegen_maven") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 24cb48b9..fdb38ea9 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -12,12 +12,14 @@ "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/MODULE.bazel": "c43c16ca2c432566cdb78913964497259903ebe8fb7d9b57b38e9f1425b427b8", "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", + "https://bcr.bazel.build/modules/apple_support/1.22.1/MODULE.bazel": "90bd1a660590f3ceffbdf524e37483094b29352d85317060b2327fff8f3f4458", "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", @@ -176,8 +178,8 @@ "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", - "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.1/MODULE.bazel": "9f8e815fba6e81dee850a33068166989000eabcf7690d2127a975c2ebda6baae", - "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.1/source.json": "7ec4d46613cc41d908cb87a58e7e7ad11dba4662640af8ae2200bd045c1e4f84", + "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.2/MODULE.bazel": "827f54f492a3ce549c940106d73de332c2b30cebd0c20c0bc5d786aba7f116cb", + "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.2/source.json": "3664514073a819992320ffbce5825e4238459df344d8b01748af2208f8d2e1eb", "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", @@ -194,6 +196,8 @@ "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96", "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a", + "https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12", "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", @@ -204,11 +208,13 @@ "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", + "https://bcr.bazel.build/modules/pybind11_bazel/2.13.6/MODULE.bazel": "2d746fda559464b253b2b2e6073cb51643a2ac79009ca02100ebbc44b4548656", + "https://bcr.bazel.build/modules/pybind11_bazel/2.13.6/source.json": "6aa0703de8efb20cc897bbdbeb928582ee7beaf278bcd001ac253e1605bddfae", "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", + "https://bcr.bazel.build/modules/re2/2025-08-12.bcr.1/MODULE.bazel": "e09b434b122bfb786a69179f9b325e35cb1856c3f56a7a81dd61609260ed46e1", + "https://bcr.bazel.build/modules/re2/2025-08-12.bcr.1/source.json": "a8ae7c09533bf67f9f6e5122d884d5741600b09d78dca6fc0f2f8d2ee0c2d957", "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", @@ -226,6 +232,7 @@ "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", + "https://bcr.bazel.build/modules/rules_cc/0.1.4/MODULE.bazel": "bb03a452a7527ac25a7518fb86a946ef63df860b9657d8323a0c50f8504fb0b9", "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", @@ -237,10 +244,12 @@ "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.1.0/MODULE.bazel": "30d9135a2b6561c761bd67bd4990da591e6bdc128790ce3e7afd6a3558b2fb64", "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.16.1/MODULE.bazel": "0f20b1cecaa8e52f60a8f071e59a20b4e3b9a67f6c56c802ea256f6face692d3", "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", @@ -255,6 +264,7 @@ "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.4/MODULE.bazel": "6a88dd22800cf1f9f79ba32cacad0d3a423ed28efa2c2ed5582eaa78dd3ac1e5", "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", @@ -273,9 +283,11 @@ "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", + "https://bcr.bazel.build/modules/rules_python/0.34.0/MODULE.bazel": "1d623d026e075b78c9fde483a889cda7996f5da4f36dffb24c246ab30f06513a", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", + "https://bcr.bazel.build/modules/rules_python/1.5.1/MODULE.bazel": "acfe65880942d44a69129d4c5c3122d57baaf3edf58ae5a6bd4edea114906bf5", "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", "https://bcr.bazel.build/modules/rules_python/1.7.0/source.json": "028a084b65dcf8f4dc4f82f8778dbe65df133f234b316828a82e060d81bdce32", @@ -288,6 +300,8 @@ "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", + "https://bcr.bazel.build/modules/rules_testing/0.6.0/MODULE.bazel": "8518d53bc742c462536d3f1a0de0c265bd7b51f32797fea4132007223ed2926f", + "https://bcr.bazel.build/modules/rules_testing/0.6.0/source.json": "915ae13ae2247c986cc57289f21e7f1d9711cd2ecfdf5867b51dc0484f3b043b", "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", @@ -297,6 +311,7 @@ "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", diff --git a/README.md b/README.md index 54eb0bd1..bde858e7 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ See [`docs/PLAN.md`](docs/PLAN.md) for the full phased plan and | 3 | Client generation (restJson1 + rpcv2Cbor) | ✅ Done — serde + clients for both protocols with typed errors ([docs/generated-types.md](docs/generated-types.md)); ~240 official protocol conformance cases green (documented exclusions) | | 4 | Server generation (restJson1 + rpcv2Cbor) | ✅ Done — handlers, routing, serde, all HTTP bindings incl. `@httpPayload`/`@httpPrefixHeaders`, constraint validation, parser strictness, content negotiation; ~1,175 official conformance cases green ([docs/server-guide.md](docs/server-guide.md)) | | 5 | Generated-client ↔ generated-server integration harness | ✅ Done — every fixture ships a generated integration suite: seeded random round-trips over loopback and real sockets, per-error mapping, unknown-member tolerance, mutation-checked ([docs/design/integration-testing.md](docs/design/integration-testing.md)) | -| 6 | Bazel rules, CLI, packaging (BCR + Maven Central), docs site | Not started | +| 6 | Bazel rules, CLI, packaging (BCR + Maven Central), docs site | 🔨 In progress — `smithy_cpp_{types,client,server}_library` rules run the generator hermetically inside the build graph, out-of-tree consumer module tested in CI, CLI via `bazel run //codegen:generator` ([docs/quickstart.md](docs/quickstart.md)); BCR/Maven publishing deferred until production validation; docs site pending | | 7 | Hardening, fuzzing, v0.1.0 | Not started | | 8 | Bidirectional streaming (event streams, WebSockets) | Not started | diff --git a/bazel/BUILD.bazel b/bazel/BUILD.bazel new file mode 100644 index 00000000..89bfdab2 --- /dev/null +++ b/bazel/BUILD.bazel @@ -0,0 +1,2 @@ +# Consumer-facing Bazel rules (defs.bzl); see docs/quickstart.md. +exports_files(["defs.bzl"]) diff --git a/bazel/defs.bzl b/bazel/defs.bzl new file mode 100644 index 00000000..cacb593e --- /dev/null +++ b/bazel/defs.bzl @@ -0,0 +1,153 @@ +"""Consumer-facing rules: generate Smithy C++ clients/servers inside the build graph. + +Usage (from any Bazel 8/9 module that depends on smithy_cpp): + + load("@smithy_cpp//bazel:defs.bzl", "smithy_cpp_client_library", "smithy_cpp_server_library") + + smithy_cpp_client_library( + name = "weather_client", + srcs = ["model/weather.smithy"], + namespace = "acme::weather", + service = "acme.weather#Weather", + ) + +Each macro runs the generator as a hermetic Java action (no Gradle, no scripts) +and wraps the generated sources in an ordinary cc_library that consumers depend +on like any other target. The service's protocol comes from the model itself +(aws.protocols#restJson1 or smithy.protocols#rpcv2Cbor). +""" + +load("@rules_cc//cc:cc_library.bzl", "cc_library") + +_GENERATOR = Label("//codegen:generator") +_RUNTIME_DEPS = [ + Label("//runtime:cbor"), + Label("//runtime:client"), + Label("//runtime:core"), + Label("//runtime:http"), + Label("//runtime:json"), +] +_SERVER_RUNTIME_DEPS = [Label("//runtime:server")] + +def _generated_files(namespace, mode): + """The exact files the generator emits for a mode (namespace drives paths).""" + ns_path = namespace.replace("::", "/") + hdrs = ["include/%s/types.h" % ns_path] + srcs = [] + if mode != "types": + hdrs.append("include/%s/serde.h" % ns_path) + srcs.append("src/serde.cc") + if mode in ("client", "both"): + hdrs.append("include/%s/client.h" % ns_path) + srcs.append("src/client.cc") + if mode in ("server", "both"): + hdrs.append("include/%s/server.h" % ns_path) + srcs.append("src/server.cc") + return hdrs, srcs + +def _smithy_cpp_generate_impl(ctx): + hdr_paths, src_paths = _generated_files(ctx.attr.namespace, ctx.attr.mode) + hdr_outputs = [ctx.actions.declare_file(ctx.label.name + "/" + p) for p in hdr_paths] + src_outputs = [ctx.actions.declare_file(ctx.label.name + "/" + p) for p in src_paths] + outputs = hdr_outputs + src_outputs + + # All outputs share the root //. + first = outputs[0] + out_root = first.path[:-(len(hdr_paths[0]) + 1)] + + args = ctx.actions.args() + for model in ctx.files.srcs: + args.add("--model", model.path) + args.add("--service", ctx.attr.service) + args.add("--namespace", ctx.attr.namespace) + args.add("--mode", ctx.attr.mode) + args.add("--emit-build-file", "false") + args.add("--output", out_root) + + ctx.actions.run( + executable = ctx.executable._generator, + arguments = [args], + inputs = ctx.files.srcs, + outputs = outputs, + mnemonic = "SmithyCppGenerate", + progress_message = "Generating Smithy C++ (%s) for %s" % (ctx.attr.mode, ctx.attr.service), + toolchain = None, + ) + return [ + DefaultInfo(files = depset(outputs)), + OutputGroupInfo(hdrs = depset(hdr_outputs), srcs = depset(src_outputs)), + ] + +_smithy_cpp_generate = rule( + implementation = _smithy_cpp_generate_impl, + attrs = { + "mode": attr.string(values = ["types", "client", "server", "both"], mandatory = True), + "namespace": attr.string(mandatory = True), + "service": attr.string(mandatory = True), + "srcs": attr.label_list(allow_files = [".smithy", ".json"], mandatory = True), + "_generator": attr.label( + default = _GENERATOR, + executable = True, + cfg = "exec", + ), + }, +) + +def _smithy_cpp_library(name, srcs, service, namespace, mode, deps, **kwargs): + gen = name + "_smithy_gen" + _smithy_cpp_generate( + name = gen, + srcs = srcs, + service = service, + namespace = namespace, + mode = mode, + visibility = ["//visibility:private"], + ) + native.filegroup( + name = gen + "_hdrs", + srcs = [":" + gen], + output_group = "hdrs", + visibility = ["//visibility:private"], + ) + native.filegroup( + name = gen + "_srcs", + srcs = [":" + gen], + output_group = "srcs", + visibility = ["//visibility:private"], + ) + cc_library( + name = name, + hdrs = [":" + gen + "_hdrs"], + srcs = [":" + gen + "_srcs"] if mode != "types" else [], + includes = [gen + "/include"], + deps = [str(d) for d in deps], + **kwargs + ) + +def smithy_cpp_types_library(name, srcs, service, namespace, **kwargs): + """Generated data types only (types.h).""" + _smithy_cpp_library( + name, + srcs, + service, + namespace, + "types", + [Label("//runtime:core")], + **kwargs + ) + +def smithy_cpp_client_library(name, srcs, service, namespace, **kwargs): + """Generated Client (+types/serde) as an ordinary cc_library.""" + _smithy_cpp_library(name, srcs, service, namespace, "client", _RUNTIME_DEPS, **kwargs) + +def smithy_cpp_server_library(name, srcs, service, namespace, **kwargs): + """Generated Handler/Server (+types/serde) as an ordinary cc_library.""" + _smithy_cpp_library( + name, + srcs, + service, + namespace, + "server", + _RUNTIME_DEPS + _SERVER_RUNTIME_DEPS, + **kwargs + ) diff --git a/bazel/tests/BUILD.bazel b/bazel/tests/BUILD.bazel new file mode 100644 index 00000000..afeec6ff --- /dev/null +++ b/bazel/tests/BUILD.bazel @@ -0,0 +1,27 @@ +load("//bazel:defs.bzl", "smithy_cpp_client_library", "smithy_cpp_server_library", "smithy_cpp_types_library") +load(":defs_test.bzl", "defs_test_suite") + +# Rule instances the analysis tests inspect; building them is also an in-tree +# compile test of rule-generated code. +smithy_cpp_client_library( + name = "greeter_client", + srcs = ["greeter.smithy"], + namespace = "smithy::cpp::ruletest", + service = "smithy.cpp.ruletest#Greeter", +) + +smithy_cpp_server_library( + name = "greeter_server", + srcs = ["greeter.smithy"], + namespace = "smithy::cpp::ruletest", + service = "smithy.cpp.ruletest#Greeter", +) + +smithy_cpp_types_library( + name = "greeter_types", + srcs = ["greeter.smithy"], + namespace = "smithy::cpp::ruletest", + service = "smithy.cpp.ruletest#Greeter", +) + +defs_test_suite(name = "defs_tests") diff --git a/bazel/tests/defs_test.bzl b/bazel/tests/defs_test.bzl new file mode 100644 index 00000000..28fb6c4f --- /dev/null +++ b/bazel/tests/defs_test.bzl @@ -0,0 +1,90 @@ +"""Analysis tests for the smithy_cpp_*_library rules (bazel/defs.bzl).""" + +load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") +load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite") + +_NS = "include/smithy/cpp/ruletest" + +def _files(target): + return sorted([f.short_path for f in target[DefaultInfo].files.to_list()]) + +def _prefixed(gen_name, paths): + return sorted(["bazel/tests/%s/%s" % (gen_name, p) for p in paths]) + +def _client_outputs_impl(env, target): + env.expect.that_collection(_files(target)).contains_exactly(_prefixed( + "greeter_client_smithy_gen", + [ + _NS + "/types.h", + _NS + "/serde.h", + _NS + "/client.h", + "src/serde.cc", + "src/client.cc", + ], + )) + action = env.expect.that_target(target).action_named("SmithyCppGenerate") + action.argv().contains_at_least([ + "--service", + "smithy.cpp.ruletest#Greeter", + "--mode", + "client", + "--emit-build-file", + "false", + ]) + +def _server_outputs_impl(env, target): + env.expect.that_collection(_files(target)).contains_exactly(_prefixed( + "greeter_server_smithy_gen", + [ + _NS + "/types.h", + _NS + "/serde.h", + _NS + "/server.h", + "src/serde.cc", + "src/server.cc", + ], + )) + env.expect.that_target(target).action_named("SmithyCppGenerate").argv().contains_at_least([ + "--mode", + "server", + ]) + +def _types_outputs_impl(env, target): + env.expect.that_collection(_files(target)).contains_exactly(_prefixed( + "greeter_types_smithy_gen", + [_NS + "/types.h"], + )) + +def _client_cc_library_impl(env, target): + # The wrapper is an ordinary cc_library whose headers resolve via the + # generated include root, so dependents just #include /client.h. + env.expect.that_bool(CcInfo in target).equals(True) + quote_includes = target[CcInfo].compilation_context.quote_includes.to_list() + system_includes = target[CcInfo].compilation_context.includes.to_list() + found = False + for path in quote_includes + system_includes: + if path.endswith("bazel/tests/greeter_client_smithy_gen/include"): + found = True + env.expect.that_bool(found).equals(True) + +def client_outputs_test(name): + analysis_test(name = name, impl = _client_outputs_impl, target = "//bazel/tests:greeter_client_smithy_gen") + +def server_outputs_test(name): + analysis_test(name = name, impl = _server_outputs_impl, target = "//bazel/tests:greeter_server_smithy_gen") + +def types_outputs_test(name): + analysis_test(name = name, impl = _types_outputs_impl, target = "//bazel/tests:greeter_types_smithy_gen") + +def client_cc_library_test(name): + analysis_test(name = name, impl = _client_cc_library_impl, target = "//bazel/tests:greeter_client") + +def defs_test_suite(name): + test_suite( + name = name, + tests = [ + client_outputs_test, + server_outputs_test, + types_outputs_test, + client_cc_library_test, + ], + ) diff --git a/bazel/tests/greeter.smithy b/bazel/tests/greeter.smithy new file mode 100644 index 00000000..2d54892a --- /dev/null +++ b/bazel/tests/greeter.smithy @@ -0,0 +1,27 @@ +$version: "2.0" + +namespace smithy.cpp.ruletest + +use aws.protocols#restJson1 + +/// Minimal service the rule analysis tests generate against. +@restJson1 +service Greeter { + version: "2026-01-01" + operations: [Greet] +} + +@readonly +@http(method: "GET", uri: "/greet/{name}") +operation Greet { + input := { + @required + @httpLabel + name: String + } + + output := { + @required + greeting: String + } +} diff --git a/codegen/BUILD.bazel b/codegen/BUILD.bazel new file mode 100644 index 00000000..19b3a597 --- /dev/null +++ b/codegen/BUILD.bazel @@ -0,0 +1,28 @@ +load("@rules_java//java:defs.bzl", "java_binary", "java_library") + +package(default_visibility = ["//visibility:public"]) + +# The generator, compiled from the same sources the Gradle build uses, so the +# smithy_cpp_*_library rules (bazel/defs.bzl) can run generation as a hermetic +# action inside the build graph. Gradle remains the dev workflow (unit tests, +# fixture regeneration); this target exists for consumers. +java_library( + name = "smithy_cpp_codegen_lib", + srcs = glob(["smithy-cpp-codegen/src/main/java/**/*.java"]), + resources = glob(["smithy-cpp-codegen/src/main/resources/**"]), + deps = [ + "@smithy_cpp_codegen_maven//:software_amazon_smithy_smithy_aws_traits", + "@smithy_cpp_codegen_maven//:software_amazon_smithy_smithy_build", + "@smithy_cpp_codegen_maven//:software_amazon_smithy_smithy_codegen_core", + "@smithy_cpp_codegen_maven//:software_amazon_smithy_smithy_model", + "@smithy_cpp_codegen_maven//:software_amazon_smithy_smithy_protocol_test_traits", + "@smithy_cpp_codegen_maven//:software_amazon_smithy_smithy_protocol_traits", + "@smithy_cpp_codegen_maven//:software_amazon_smithy_smithy_utils", + ], +) + +java_binary( + name = "generator", + main_class = "io.smithycpp.codegen.CppCodegenRunner", + runtime_deps = [":smithy_cpp_codegen_lib"], +) diff --git a/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/BuildFileGenerator.java b/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/BuildFileGenerator.java index a3f99845..4f3009ff 100644 --- a/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/BuildFileGenerator.java +++ b/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/BuildFileGenerator.java @@ -10,7 +10,11 @@ final class BuildFileGenerator { private BuildFileGenerator() {} static void run( - CppContext context, ProtocolGenerator protocol, boolean hasClient, boolean hasSerde) { + CppContext context, + ProtocolGenerator protocol, + boolean hasClient, + boolean hasSerde, + boolean hasServer) { CppSettings settings = context.settings(); StringBuilder out = new StringBuilder(); out.append( @@ -71,7 +75,8 @@ static void run( """ .formatted(settings.clientHeaderFile())); appendDeps(out, deps); - + } + if (hasServer) { List serverDeps = new ArrayList<>(); serverDeps.add("\":serde\""); serverDeps.add("\":types\""); diff --git a/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/CppCodegenRunner.java b/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/CppCodegenRunner.java index 72e49573..97fcd364 100644 --- a/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/CppCodegenRunner.java +++ b/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/CppCodegenRunner.java @@ -19,7 +19,7 @@ * Gradle tasks (and anyone who wants generation without smithy-build): * *
- * CppCodegenRunner [--model M.smithy] --service NS#Svc --namespace a::b \
+ * CppCodegenRunner [--model M.smithy]... --service NS#Svc --namespace a::b \
  *     --runtime-target //runtime:core --output DIR \
  *     [--tests-package //pkg] [--omit-operation NS#Op]... [--malformed-tests true]
  * 
@@ -42,6 +42,8 @@ public static void main(String[] args) { String testsPackage = null; boolean malformedTests = false; boolean integrationTests = false; + String mode = null; + Boolean emitBuildFile = null; List omitOperations = new ArrayList<>(); for (int i = 0; i + 1 < args.length; i += 2) { switch (args[i]) { @@ -54,6 +56,8 @@ public static void main(String[] args) { case "--omit-operation" -> omitOperations.add(args[i + 1]); case "--malformed-tests" -> malformedTests = Boolean.parseBoolean(args[i + 1]); case "--integration-tests" -> integrationTests = Boolean.parseBoolean(args[i + 1]); + case "--mode" -> mode = args[i + 1]; + case "--emit-build-file" -> emitBuildFile = Boolean.parseBoolean(args[i + 1]); default -> throw new IllegalArgumentException("unknown argument: " + args[i]); } } @@ -92,6 +96,12 @@ public static void main(String[] args) { if (integrationTests) { settings.withMember("integrationTests", true); } + if (mode != null) { + settings.withMember("mode", mode); + } + if (emitBuildFile != null) { + settings.withMember("emitBuildFile", emitBuildFile); + } PluginContext context = PluginContext.builder() diff --git a/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/CppSettings.java b/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/CppSettings.java index 033fa773..89a1114f 100644 --- a/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/CppSettings.java +++ b/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/CppSettings.java @@ -23,6 +23,8 @@ public final class CppSettings { private final String testsPackage; private final boolean malformedTests; private final boolean integrationTests; + private final String mode; + private final boolean emitBuildFile; private CppSettings( ShapeId service, @@ -30,13 +32,17 @@ private CppSettings( String runtimeTarget, String testsPackage, boolean malformedTests, - boolean integrationTests) { + boolean integrationTests, + String mode, + boolean emitBuildFile) { this.service = service; this.namespace = namespace; this.runtimeTarget = runtimeTarget; this.testsPackage = testsPackage; this.malformedTests = malformedTests; this.integrationTests = integrationTests; + this.mode = mode; + this.emitBuildFile = emitBuildFile; } public static CppSettings fromNode(ObjectNode node) { @@ -47,12 +53,25 @@ public static CppSettings fromNode(ObjectNode node) { String testsPackage = node.getStringMemberOrDefault("testsPackage", null); boolean malformedTests = node.getBooleanMemberOrDefault("malformedTests", false); boolean integrationTests = node.getBooleanMemberOrDefault("integrationTests", false); + String mode = node.getStringMemberOrDefault("mode", "both"); + boolean emitBuildFile = node.getBooleanMemberOrDefault("emitBuildFile", true); + if (!mode.matches("types|client|server|both")) { + throw new IllegalArgumentException( + "cpp-codegen: 'mode' must be types, client, server, or both, got: " + mode); + } if (!namespace.matches("[A-Za-z_][A-Za-z0-9_]*(::[A-Za-z_][A-Za-z0-9_]*)*")) { throw new IllegalArgumentException( "cpp-codegen: 'namespace' must be a C++ namespace like a::b, got: " + namespace); } return new CppSettings( - service, namespace, runtimeTarget, testsPackage, malformedTests, integrationTests); + service, + namespace, + runtimeTarget, + testsPackage, + malformedTests, + integrationTests, + mode, + emitBuildFile); } public ShapeId service() { @@ -124,6 +143,24 @@ public boolean integrationTests() { return integrationTests; } + /** What to generate: types | client | server | both (the Bazel rules pick one per target). */ + public String mode() { + return mode; + } + + public boolean generateClient() { + return mode.equals("client") || mode.equals("both"); + } + + public boolean generateServer() { + return mode.equals("server") || mode.equals("both"); + } + + /** Off when generation runs as a Bazel action (the consumer wrote the BUILD file). */ + public boolean emitBuildFile() { + return emitBuildFile; + } + @Override public boolean equals(Object other) { if (!(other instanceof CppSettings that)) { @@ -134,12 +171,21 @@ public boolean equals(Object other) { && runtimeTarget.equals(that.runtimeTarget) && Objects.equals(testsPackage, that.testsPackage) && malformedTests == that.malformedTests - && integrationTests == that.integrationTests; + && integrationTests == that.integrationTests + && mode.equals(that.mode) + && emitBuildFile == that.emitBuildFile; } @Override public int hashCode() { return Objects.hash( - service, namespace, runtimeTarget, testsPackage, malformedTests, integrationTests); + service, + namespace, + runtimeTarget, + testsPackage, + malformedTests, + integrationTests, + mode, + emitBuildFile); } } diff --git a/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/DirectedCppCodegen.java b/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/DirectedCppCodegen.java index 6687505f..4980425c 100644 --- a/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/DirectedCppCodegen.java +++ b/codegen/smithy-cpp-codegen/src/main/java/io/smithycpp/codegen/DirectedCppCodegen.java @@ -47,21 +47,30 @@ public void generateService(GenerateServiceDirective di SerdeGenerator serdeGenerator = new SerdeGenerator(directive.context(), protocol != null && protocol.usesJsonName()); - boolean hasSerde = !serdeGenerator.serdeShapes().isEmpty(); + boolean hasSerde = + !directive.settings().mode().equals("types") && !serdeGenerator.serdeShapes().isEmpty(); if (hasSerde) { serdeGenerator.run(); } boolean hasClient = false; - if (protocol != null) { + boolean hasServer = false; + if (protocol != null && !directive.settings().mode().equals("types")) { ClientGenerator clientGenerator = new ClientGenerator(directive.context(), service, protocol); java.util.List operations = clientGenerator.operations(); if (!operations.isEmpty()) { - clientGenerator.run(); - hasClient = true; - new ServerGenerator(directive.context(), service, protocol, operations).run(); - if (directive.settings().testsPackage() != null) { + if (directive.settings().generateClient()) { + clientGenerator.run(); + hasClient = true; + } + if (directive.settings().generateServer()) { + new ServerGenerator(directive.context(), service, protocol, operations).run(); + hasServer = true; + } + // The generated test suites drive the client against the server, so + // they only exist for mode=both (the fixture/protocol-test pipelines). + if (directive.settings().testsPackage() != null && hasClient && hasServer) { new SmokeTestGenerator(directive.context(), service, operations).run(); boolean hasProtocolTests = operations.stream() @@ -100,7 +109,9 @@ public void generateService(GenerateServiceDirective di } } } - BuildFileGenerator.run(directive.context(), protocol, hasClient, hasSerde); + if (directive.settings().emitBuildFile()) { + BuildFileGenerator.run(directive.context(), protocol, hasClient, hasSerde, hasServer); + } } /** Null when the service declares no supported protocol (types+serde still generate). */ diff --git a/docs/PLAN.md b/docs/PLAN.md index 753a058e..1c67edac 100644 --- a/docs/PLAN.md +++ b/docs/PLAN.md @@ -469,6 +469,9 @@ without reading generator internals or touching Gradle. never as a "run this script first" step. - bzlmod module `smithy_cpp` published to the **Bazel Central Registry**; runtime targets (`@smithy_cpp//runtime:core`, `:client`, `:server`, …) consumable directly. + **Deferred**: BCR (and Maven Central) publishing waits until the project is validated in + production; until then consumers use `git_override`/`local_path_override` (see + docs/quickstart.md). - Out-of-tree consumer example (`examples/bazel-consumer/`) exercised in CI: a standalone Bazel 9 module that depends on the released `smithy_cpp` module, defines a model, builds client + server, and runs the Phase-5-style integration test — this is the quick-start @@ -509,6 +512,9 @@ the project) completes the tutorial without help; BCR + Maven Central packaging **Tasks** - **Client robustness**: retry policy (exponential backoff + jitter, honoring `@retryable`), connection pooling in the curl transport, request timeouts end-to-end, cancellation. +- **`@requestCompression`** (gzip request bodies): a compression codec in the runtime (zlib via + BCR) plus client-side emission; unprunes the suite's compression operations and their + malformed tests. - **Server robustness**: thread-pool tuning knobs, graceful shutdown/drain, request size limits, slow-client timeouts, structured logging hooks, metrics hooks (request count/latency callbacks). - **Auth hooks**: `@httpBearerAuth` / `@httpApiKeyAuth` support — client-side credential @@ -534,6 +540,17 @@ the full test matrix and the quick-start acceptance test. --- +### Future protocols: JSON-RPC 2.0 (post-0.1.0, candidate phase) + +The generator is protocol-pluggable by construction — `ProtocolGenerator` is an interface and +`resolveProtocol` picks the implementation from the service's protocol trait, which is how +restJson1 and rpcv2Cbor coexist today. A JSON-RPC 2.0 protocol is a natural third +implementation: a custom `@jsonRpc2` protocol trait, a fixed POST endpoint with +`method` = operation name and `params`/`result` over the same `smithy::Document` serde pivot, +and JSON-RPC error objects mapped to modeled errors. It inherits the whole test machinery +(smoke, integration, goldens) for free. Not scheduled; recorded here so the protocol seam stays +honest. + ### Phase 8 — Bidirectional streaming (post-0.1.0, ≈6–8 weeks) **Goals:** first-class streaming operations: `@streaming` blob streams and event-stream unions, diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 00000000..ac116f85 --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,112 @@ +# Quick start: model → client + server in one Bazel module + +From an empty directory to a generated C++ client integration-testing a generated C++ server, +without touching the generator's internals. The finished result of every step below lives at +[`examples/bazel-consumer/`](../examples/bazel-consumer) — CI builds that module standalone on +every commit, so this tutorial cannot silently rot. + +## 1. Create a Bazel module + +`MODULE.bazel`: + +```starlark +module(name = "my_service", version = "0.0.0") + +bazel_dep(name = "smithy_cpp", version = "0.0.0") + +# Until smithy_cpp is published to the Bazel Central Registry (deferred until +# the project is production-validated), consume it by path or git override: +git_override( + module_name = "smithy_cpp", + remote = "https://github.com/aaylward/smithy-cpp.git", + commit = "", +) + +bazel_dep(name = "googletest", version = "1.17.0.bcr.2") +bazel_dep(name = "rules_cc", version = "0.2.17") +``` + +`.bazelrc` (C++20 is the runtime baseline; the generator runs on a hermetic Java 17 toolchain): + +``` +common --enable_platform_specific_config +build:linux --cxxopt=-std=c++20 --host_cxxopt=-std=c++20 +build:macos --cxxopt=-std=c++20 --host_cxxopt=-std=c++20 +build:windows --cxxopt=/std:c++20 --host_cxxopt=/std:c++20 +common --java_language_version=17 +common --tool_java_language_version=17 +common --java_runtime_version=remotejdk_17 +common --tool_java_runtime_version=remotejdk_17 +``` + +## 2. Write a model + +`model/todo.smithy` — a service, an operation or two, a modeled error. The service's protocol +comes from its trait: `aws.protocols#restJson1` or `smithy.protocols#rpcv2Cbor`. + +## 3. Declare the generated libraries + +`BUILD.bazel`: + +```starlark +load("@smithy_cpp//bazel:defs.bzl", "smithy_cpp_client_library", "smithy_cpp_server_library") + +smithy_cpp_client_library( + name = "todo_client", + srcs = ["model/todo.smithy"], + namespace = "acme::todo", + service = "acme.todo#Todo", +) + +smithy_cpp_server_library( + name = "todo_server", + srcs = ["model/todo.smithy"], + namespace = "acme::todo", + service = "acme.todo#Todo", +) +``` + +Generation runs inside the build graph as a hermetic action — correct caching, no scripts, no +Gradle. Each target is an ordinary `cc_library`: depend on it, `#include "acme/todo/client.h"`, +done. (`smithy_cpp_types_library` exists too, for data types without a protocol.) + +## 4. Implement the handler and test it with the generated client + +The server library gives you a pure-virtual `TodoHandler` and a `TodoServer`; the client library +a `TodoClient`. Wire them together over the in-memory loopback (or a real socket) exactly like +[`todo_integration_test.cc`](../examples/bazel-consumer/todo_integration_test.cc): + +```cpp +TodoServer server(std::make_shared()); +auto loopback = std::make_shared(); +(void)loopback->Start(server.Handler()); +smithy::ClientConfig config; +config.http_client = loopback; +auto client = *TodoClient::Create(std::move(config)); +``` + +Routing, serde, constraint validation (400 `ValidationException` before your handler runs), +content negotiation, and modeled-error mapping are all generated — see +[server-guide.md](server-guide.md) for what the server does on your behalf. + +## 5. Run it + +```sh +bazel test //... +``` + +For production serving, plug `server.Handler()` into `smithy::http::BeastServerTransport` +(`@smithy_cpp//runtime:http_beast`, ADR-0006). + +## Generating outside Bazel + +The generator is also a plain CLI for inspecting output or vendoring generated sources: + +```sh +bazel run @smithy_cpp//codegen:generator -- \ + --model $PWD/model/todo.smithy --service acme.todo#Todo \ + --namespace acme::todo --mode both --output /tmp/generated +``` + +`--mode types|client|server|both` picks what to emit; `--emit-build-file false` suppresses the +generated `BUILD.bazel` when you're writing your own. diff --git a/examples/bazel-consumer/.bazelrc b/examples/bazel-consumer/.bazelrc new file mode 100644 index 00000000..7ed5baf4 --- /dev/null +++ b/examples/bazel-consumer/.bazelrc @@ -0,0 +1,15 @@ +# C++20 (the smithy-cpp runtime baseline) and the Java 17 toolchain the +# generator action runs on. Copy these lines into your own .bazelrc. +common --enable_platform_specific_config + +build:linux --cxxopt=-std=c++20 --host_cxxopt=-std=c++20 +build:macos --cxxopt=-std=c++20 --host_cxxopt=-std=c++20 +build:windows --cxxopt=/std:c++20 --host_cxxopt=/std:c++20 +common --java_language_version=17 +common --tool_java_language_version=17 +common --java_runtime_version=remotejdk_17 +common --tool_java_runtime_version=remotejdk_17 +test --test_output=errors + +# Personal overrides stay out of version control. +try-import %workspace%/.bazelrc.user diff --git a/examples/bazel-consumer/.gitignore b/examples/bazel-consumer/.gitignore new file mode 100644 index 00000000..674c3473 --- /dev/null +++ b/examples/bazel-consumer/.gitignore @@ -0,0 +1,2 @@ +/.bazelrc.user +/bazel-* diff --git a/examples/bazel-consumer/BUILD.bazel b/examples/bazel-consumer/BUILD.bazel new file mode 100644 index 00000000..f7817b37 --- /dev/null +++ b/examples/bazel-consumer/BUILD.bazel @@ -0,0 +1,31 @@ +load("@rules_cc//cc:defs.bzl", "cc_test") +load("@smithy_cpp//bazel:defs.bzl", "smithy_cpp_client_library", "smithy_cpp_server_library") + +smithy_cpp_client_library( + name = "todo_client", + srcs = ["model/todo.smithy"], + namespace = "acme::todo", + service = "acme.todo#Todo", +) + +smithy_cpp_server_library( + name = "todo_server", + srcs = ["model/todo.smithy"], + namespace = "acme::todo", + service = "acme.todo#Todo", +) + +# The generated client integration-tests the generated server (the Phase 5 +# pattern): loopback and a real socket on an ephemeral port. +cc_test( + name = "todo_integration_test", + size = "small", + srcs = ["todo_integration_test.cc"], + deps = [ + ":todo_client", + ":todo_server", + "@googletest//:gtest_main", + "@smithy_cpp//runtime:client", + "@smithy_cpp//runtime:http", + ], +) diff --git a/examples/bazel-consumer/MODULE.bazel b/examples/bazel-consumer/MODULE.bazel new file mode 100644 index 00000000..4386e2b3 --- /dev/null +++ b/examples/bazel-consumer/MODULE.bazel @@ -0,0 +1,18 @@ +# Out-of-tree consumer of smithy_cpp: the quick-start acceptance test. +# CI builds this module standalone (cd examples/bazel-consumer && bazel test //...). +module( + name = "smithy_cpp_consumer", + version = "0.0.0", +) + +bazel_dep(name = "smithy_cpp", version = "0.0.0") + +# Until smithy_cpp is published to the Bazel Central Registry (deferred until +# the project is production-validated), consume it by path or git override. +local_path_override( + module_name = "smithy_cpp", + path = "../..", +) + +bazel_dep(name = "googletest", version = "1.17.0.bcr.2") +bazel_dep(name = "rules_cc", version = "0.2.17") diff --git a/examples/bazel-consumer/MODULE.bazel.lock b/examples/bazel-consumer/MODULE.bazel.lock new file mode 100644 index 00000000..222d9af1 --- /dev/null +++ b/examples/bazel-consumer/MODULE.bazel.lock @@ -0,0 +1,576 @@ +{ + "lockFileVersion": 26, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", + "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/MODULE.bazel": "c43c16ca2c432566cdb78913964497259903ebe8fb7d9b57b38e9f1425b427b8", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", + "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", + "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", + "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", + "https://bcr.bazel.build/modules/apple_support/1.22.1/MODULE.bazel": "90bd1a660590f3ceffbdf524e37483094b29352d85317060b2327fff8f3f4458", + "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", + "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", + "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", + "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", + "https://bcr.bazel.build/modules/bazel_features/1.42.1/source.json": "fcd4396b2df85f64f2b3bb436ad870793ecf39180f1d796f913cc9276d355309", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/source.json": "34a3c8bcf233b835eb74be9d628899bb32999d3e0eadef1947a0a562a2b16ffb", + "https://bcr.bazel.build/modules/boost.algorithm/1.87.0/MODULE.bazel": "d1c8f1466cc1a04a16eebeefe0f54a9508cc9f1a3c21d65d806acbc36593e204", + "https://bcr.bazel.build/modules/boost.algorithm/1.87.0/source.json": "9280ee3bfa6b9427aad20a450c33d74fabb93a69d81e201955098035a514f287", + "https://bcr.bazel.build/modules/boost.align/1.87.0/MODULE.bazel": "b9b08a94ac9db10fa17a58fc278a8c79fdb32c915de7a9133f6f01f6fe8887f7", + "https://bcr.bazel.build/modules/boost.align/1.87.0/source.json": "c41e1675e9686a3d82b130ccf496d5780fc4edf42ff2e91b2323fd05d3773e81", + "https://bcr.bazel.build/modules/boost.array/1.87.0/MODULE.bazel": "beb11f5d659b17df58c07e039392edc9233e1be9565e5d4b1393fff9bf4457c4", + "https://bcr.bazel.build/modules/boost.array/1.87.0/source.json": "0583a9fd9d24a14e33b74b4342f94b4a4a3b539af11b0c12403a1a4da1f1548a", + "https://bcr.bazel.build/modules/boost.asio/1.87.0.bcr.1/MODULE.bazel": "1ade8151b7b7e31f438851097447773ba338ef08713b70792c033fdc9b2879bc", + "https://bcr.bazel.build/modules/boost.asio/1.87.0.bcr.1/source.json": "b789f2c3da92dea05ce6a1b879d16de31f71b552b949c02b2c0760ee70ebbbe7", + "https://bcr.bazel.build/modules/boost.assert/1.87.0/MODULE.bazel": "8a950da6e19dd6d6427b95b1cfe1d2fc86eb598f6fb753345d925eb92d74a821", + "https://bcr.bazel.build/modules/boost.assert/1.87.0/source.json": "085a7c247d90bb4f8f5c3cc7eec1994f3d46d2a26af1947c85ff6f8ddd86ce59", + "https://bcr.bazel.build/modules/boost.beast/1.87.0/MODULE.bazel": "79907ddb4ce6863e508faa512779adb50e47e6215c38d91ffdf05da801edc819", + "https://bcr.bazel.build/modules/boost.beast/1.87.0/source.json": "e6515252849d1f01ae6a7594d48c0112c0d82d5f0a1475b1d5befd414cf9e340", + "https://bcr.bazel.build/modules/boost.bind/1.87.0/MODULE.bazel": "6d224cd013e45d15710476840fff34aa2da53389c3bfd252054e2efd893b0bf9", + "https://bcr.bazel.build/modules/boost.bind/1.87.0/source.json": "e93e696ab6140c1f07317357b04b4d0fcf0aefa61991b8fa8b65416d81677b44", + "https://bcr.bazel.build/modules/boost.chrono/1.87.0/MODULE.bazel": "ac035fc481cfaf6dd0b42c791938aa53d5ad7debba1a877c0169d1cc9deae874", + "https://bcr.bazel.build/modules/boost.chrono/1.87.0/source.json": "a050f84c8488008a3ac15550592259cbf90abf86ca31052f30f120f4e60de772", + "https://bcr.bazel.build/modules/boost.concept_check/1.87.0/MODULE.bazel": "6a935c9f5d739ad6d0401d1e5f71f4bfb538c66ccb1d3b8ac7a5a2b74bd207ff", + "https://bcr.bazel.build/modules/boost.concept_check/1.87.0/source.json": "45ffc4ae171c9b14bbe595e3d3e7d0a5065ceb18f949d1a2365d328ca89e1a1c", + "https://bcr.bazel.build/modules/boost.config/1.87.0/MODULE.bazel": "01da6517cb341d5abea9be54337bf85ba50132b3690a621f09be5890ecd12796", + "https://bcr.bazel.build/modules/boost.config/1.87.0/source.json": "9a00cd7c9afd6f58b349a806791c7aab040b1cd1a35464e59b79be724261a5ae", + "https://bcr.bazel.build/modules/boost.container/1.87.0.bcr.1/MODULE.bazel": "52b2aebae665c32464dd1bbf526073b5ae3c2cbb7973b44cb5fc49da4f31c0ba", + "https://bcr.bazel.build/modules/boost.container/1.87.0.bcr.1/source.json": "5699d6bf2b3a48315628edd48e116cfe4ad849bb9124c72e16a5b29f6d340cbe", + "https://bcr.bazel.build/modules/boost.container/1.87.0/MODULE.bazel": "affb6e485eb13d3df0e9ee464f6a890175762526166da601a83f12d21b6c6950", + "https://bcr.bazel.build/modules/boost.container_hash/1.87.0/MODULE.bazel": "a718ac13832c18ffc828f33e9cf8e566095d5ed8c80584bd1ad429c4ce91efa5", + "https://bcr.bazel.build/modules/boost.container_hash/1.87.0/source.json": "a7a90c4dfea2da1648ac530a838faebc093cbbaeab5e4f43a8532e5b76ff32d3", + "https://bcr.bazel.build/modules/boost.context/1.87.0/MODULE.bazel": "9382a2dd1a1010989ef93e7d85344c19bbff5b4b6b72cbd7f96d985b16dfde6e", + "https://bcr.bazel.build/modules/boost.context/1.87.0/source.json": "4f6b7c3e8f7d863caf133edbead540c636d4647ea5c3f2d594d85b7e3648ffae", + "https://bcr.bazel.build/modules/boost.conversion/1.87.0/MODULE.bazel": "47bafdb6a14ec58feefe69a1367b537458563e0627e1986f377cc0b4e8ebd41e", + "https://bcr.bazel.build/modules/boost.conversion/1.87.0/source.json": "7aa865b11b0a699d15926eb87a21d17220d64265da3d280261a480b0d88b3dbb", + "https://bcr.bazel.build/modules/boost.core/1.87.0/MODULE.bazel": "33517eb46bb16f4b4f4a1bde61fe8b2475f45b5574bcd9f04c85f4bf3afe30d2", + "https://bcr.bazel.build/modules/boost.core/1.87.0/source.json": "9e2920b45c833a6a2cd42b16e17a5b97201bb73698a3902936cc90c1aa3de667", + "https://bcr.bazel.build/modules/boost.coroutine/1.87.0/MODULE.bazel": "60acc3fcc1845b3fb02159d2a74ef8a3de29d2f20713e2b1c2b3c84c74da5f83", + "https://bcr.bazel.build/modules/boost.coroutine/1.87.0/source.json": "3b3d7f7df63287305337c34ff6a0c33f3d78a157ec79324ee9a467d6f0ebaa51", + "https://bcr.bazel.build/modules/boost.date_time/1.87.0/MODULE.bazel": "ea715c044273af6148b68bcfb4dbb69a36ec34cd3a491e1a2740b4090bf32025", + "https://bcr.bazel.build/modules/boost.date_time/1.87.0/source.json": "cfa5ce699286cd6eee94bace45dc701717ed58826827bd0ade18ef63623fdbe3", + "https://bcr.bazel.build/modules/boost.describe/1.87.0/MODULE.bazel": "638752de4ad46348a7e3ac72910b699fde5a3c71d42fc69047d2aa8825411646", + "https://bcr.bazel.build/modules/boost.describe/1.87.0/source.json": "c260a5c38806ea88ce50b2d070484ae634941d2be7a1ddb0f959923ca8ef10d4", + "https://bcr.bazel.build/modules/boost.detail/1.87.0/MODULE.bazel": "64ed391c2b60b226263de4f486fad690414afc6a68d1a5e58eed70e4a63f2d80", + "https://bcr.bazel.build/modules/boost.detail/1.87.0/source.json": "dde910ab5e8ca18352cceaf4a922904b3de9ace042bf16f1a2015ca53776a568", + "https://bcr.bazel.build/modules/boost.endian/1.87.0/MODULE.bazel": "a81d743d6b76c4d40c2289be435aa5ccfa912f0caecbc1b75948563e39b5fcf1", + "https://bcr.bazel.build/modules/boost.endian/1.87.0/source.json": "546459497e163255dcd76ab78cadef2ede4f13c32620f219ad3d7fa43074c515", + "https://bcr.bazel.build/modules/boost.exception/1.87.0/MODULE.bazel": "2bc7bfa2166bccb25c8b814ad8d5bf462448349ffd41e9541cfa7b849bd15ca8", + "https://bcr.bazel.build/modules/boost.exception/1.87.0/source.json": "987bb7df5cbf05e4c3349073fe889e33b8914ea9b9b0b5cf72bc742941343d8b", + "https://bcr.bazel.build/modules/boost.function/1.87.0/MODULE.bazel": "d7ad93c26d0102b48cd6f781fcb68d16861fd6bf8772f784f034afabbabea391", + "https://bcr.bazel.build/modules/boost.function/1.87.0/source.json": "dd6765e2d9d902fc82da874f55061cf233a17affa66acb1641f478480b80d5d2", + "https://bcr.bazel.build/modules/boost.function_types/1.87.0/MODULE.bazel": "fed8aedff1fb01468a24e53a10793411330e36ebe29aeafaadeae00e25c20371", + "https://bcr.bazel.build/modules/boost.function_types/1.87.0/source.json": "c3a7fa0a172a109ae04a575eba033e133a38448005468dfddedab065d071dbbf", + "https://bcr.bazel.build/modules/boost.functional/1.87.0/MODULE.bazel": "5488597db90a4d8615505e9673806db23a98a4c73eadc16999478c7b1a6c1bc7", + "https://bcr.bazel.build/modules/boost.functional/1.87.0/source.json": "d39c98b1a9ae0a74da51ff049054fe6f77060d00c1768ea7eb6c629f3ac9eea5", + "https://bcr.bazel.build/modules/boost.fusion/1.87.0/MODULE.bazel": "2c28c212edcf35584dcf09089c51d6dcb2a01cf5d8d5c2b125dc91acb083a463", + "https://bcr.bazel.build/modules/boost.fusion/1.87.0/source.json": "35cb70a4a379e430e9efde27c9c2aa061791e9a1f693f7c85d2d4f1665ba2381", + "https://bcr.bazel.build/modules/boost.integer/1.87.0/MODULE.bazel": "2b862679c8595b6ecb3806ec5c7a1024c9e00fca94e5ee713d75ab022c6a7444", + "https://bcr.bazel.build/modules/boost.integer/1.87.0/source.json": "adce74ac44da997658d139f419f3c6a909fdc35d05566814c9c15e3ccb99fff6", + "https://bcr.bazel.build/modules/boost.intrusive/1.87.0/MODULE.bazel": "9dd904f7da54b7efa8476da8152e8cd60702e7b61bfae2689672f185458dc478", + "https://bcr.bazel.build/modules/boost.intrusive/1.87.0/source.json": "cc603911503905072f8596510bb6e95ce210a82564258d3fd319f9499f339cf6", + "https://bcr.bazel.build/modules/boost.io/1.87.0/MODULE.bazel": "30b1fbdc4a0463f727e2a78558550adf05c61e1fc209a6dcd35df03eaa4dafac", + "https://bcr.bazel.build/modules/boost.io/1.87.0/source.json": "b42dd52763c9bce54ed4a4c8ef48d560460f854bb53770f37c839180dba897e0", + "https://bcr.bazel.build/modules/boost.iterator/1.87.0/MODULE.bazel": "7e6ce23b059902c1709ba033dd1f4783b3de3f48ec4dc9f5e6ab82ddc699223e", + "https://bcr.bazel.build/modules/boost.iterator/1.87.0/source.json": "69d37225c6ffc3e8af0e7ea427ff51ccb04d84c6e7e361bbb8f1dc859b4412ea", + "https://bcr.bazel.build/modules/boost.lexical_cast/1.87.0/MODULE.bazel": "878478bbe6d3350cad171dd1b4558732dbee7021ab69e40a3c5bf9e59b37922c", + "https://bcr.bazel.build/modules/boost.lexical_cast/1.87.0/source.json": "80e0443943851508f2fa427c1c48b714690691c7022082ec65551dbe4680c82e", + "https://bcr.bazel.build/modules/boost.logic/1.87.0/MODULE.bazel": "a3087bd403c278bbfd7ef2cfb83ed72a812b60231285e823735db006a30de394", + "https://bcr.bazel.build/modules/boost.logic/1.87.0/source.json": "4ed14f9c0cdecfe74102f5333c27ca1867927ebbd15420c012a2e2e364b9c95e", + "https://bcr.bazel.build/modules/boost.move/1.87.0/MODULE.bazel": "5f26dacea41a8d617b6097219df961405c8a08a9315da14cefa8da15587a7fc5", + "https://bcr.bazel.build/modules/boost.move/1.87.0/source.json": "a95f9b258ddf918c3137c2b8d223b0b55cf9a17a52d4e19ccabfe650dcf118e3", + "https://bcr.bazel.build/modules/boost.mp11/1.87.0/MODULE.bazel": "af9644d2b668f3e014ac335a8a84ac74d9cb263454cd07cd5b84ce206f5dd81f", + "https://bcr.bazel.build/modules/boost.mp11/1.87.0/source.json": "fb17f9453d8e62a6425efccc3a827f29ddb4577aaffee68393c86bd21e517187", + "https://bcr.bazel.build/modules/boost.mpl/1.87.0/MODULE.bazel": "72eba3a8cc5711e15a852829d00482abbf7869ed2ee6f598b8f295261f3e5496", + "https://bcr.bazel.build/modules/boost.mpl/1.87.0/source.json": "81a99487d926f8a26dd5d80662e14baa0a6842b81a2a47f3f529064d0a36f36f", + "https://bcr.bazel.build/modules/boost.numeric_conversion/1.87.0/MODULE.bazel": "0164792509fbf8e6374eeb94a8e84ba8aa5e939620266177a112eac118e67f7c", + "https://bcr.bazel.build/modules/boost.numeric_conversion/1.87.0/source.json": "b19fe476ce051ee4b127f78b2ee4fcec917f60e2f0a06a26528c5666b355d623", + "https://bcr.bazel.build/modules/boost.optional/1.87.0/MODULE.bazel": "a12ca5b2394521bd60e432c9a98623d5a33edf9f7f891fb26c5d0840fb6b182e", + "https://bcr.bazel.build/modules/boost.optional/1.87.0/source.json": "38de88d9d67d2c7673a2c3a817a578c2ead946a11ae111f24f71859b401b0656", + "https://bcr.bazel.build/modules/boost.pool/1.87.0/MODULE.bazel": "f579ff6f6883b594f792c15b3528d1a17532f4b2454e1b457eeedf03cb9f3cf7", + "https://bcr.bazel.build/modules/boost.pool/1.87.0/source.json": "acb6b53f4b50fbb3f5246b23eef833f98acd8ccf0894d48e9b93fd76a89f2d0c", + "https://bcr.bazel.build/modules/boost.predef/1.87.0/MODULE.bazel": "4bb0cc9a326ea8ffde86044c2dbdf08b75d5e8fe7e4ea8c399b058262680a890", + "https://bcr.bazel.build/modules/boost.predef/1.87.0/source.json": "421162e76f175a64d22296b9cf3272441324fa994766acffd367182a777ad092", + "https://bcr.bazel.build/modules/boost.preprocessor/1.87.0/MODULE.bazel": "fdbcce15c585de47e4a5e9f6e2b9aa87f690a87e205eded400c5590f7e64535a", + "https://bcr.bazel.build/modules/boost.preprocessor/1.87.0/source.json": "ef9b9006890126f5880bb51ccbe8a97a95baf21606e2f30acdb1c30c0dd79758", + "https://bcr.bazel.build/modules/boost.range/1.87.0/MODULE.bazel": "b1604553c080ca8620fb8e16267b397d4345986acae9ddd8277f36ad87236b60", + "https://bcr.bazel.build/modules/boost.range/1.87.0/source.json": "3477215270d2295f882b0b127347fddf69aecdb7cd77ba315e55199c36208661", + "https://bcr.bazel.build/modules/boost.ratio/1.87.0/MODULE.bazel": "c5a3695cd1bbb22d6a00a6df2c857be1f52f64f36fa3a89bd6835de94485fa60", + "https://bcr.bazel.build/modules/boost.ratio/1.87.0/source.json": "86662c1c2dd510741c8838c43b53a685183fd7ca793d04a8660f0d3f68317005", + "https://bcr.bazel.build/modules/boost.rational/1.87.0/MODULE.bazel": "421044b95b2db3ca1ae3a93ba12e235db938c9786c3a209a2b50754c3c0a07d7", + "https://bcr.bazel.build/modules/boost.rational/1.87.0/source.json": "876156ee5dacf41912b6f3516160ab70b07ee974321ec141f58f6caf99999630", + "https://bcr.bazel.build/modules/boost.regex/1.87.0/MODULE.bazel": "b91f176af90ce5ad96c8be6f83c4fb253fc8b391055e23a349f35e76e679e302", + "https://bcr.bazel.build/modules/boost.regex/1.87.0/source.json": "a887e4a0ac22ae2eb6203bbfbc2b6a9581edc1d65af0a8c392b30327a7688432", + "https://bcr.bazel.build/modules/boost.smart_ptr/1.87.0/MODULE.bazel": "a2a2b804d33fd47e37b33bb0b47a66b07aab616c12083654f4d9b92ab1308470", + "https://bcr.bazel.build/modules/boost.smart_ptr/1.87.0/source.json": "ff2c2bc2620fd9f404ea1937f38c1776a6b88ae17516c440eda88366fbd14c91", + "https://bcr.bazel.build/modules/boost.static_assert/1.87.0/MODULE.bazel": "06e7170d6e4ec08d6a4a83d1f0bce3f7fdacd89e4dcaa93d508f971e4e363d4f", + "https://bcr.bazel.build/modules/boost.static_assert/1.87.0/source.json": "d5b3f81fba6382b83885ff2dfaef07a5788323ed82d472d2fd629fcbba04ec7a", + "https://bcr.bazel.build/modules/boost.static_string/1.87.0/MODULE.bazel": "0b6606a2aad1d3f404742015419eebb46f08c237186b7e2e0b1dc896e9273a58", + "https://bcr.bazel.build/modules/boost.static_string/1.87.0/source.json": "0a10768ebaa90d8acbe7ef1d8ec268f5d0859b5f3677b0cb657386cdcd02f9bc", + "https://bcr.bazel.build/modules/boost.system/1.87.0/MODULE.bazel": "fe98a0cf5cd04613f81b2b4338ccf22d75f4049875c294a35c0949c3c6e8cbc1", + "https://bcr.bazel.build/modules/boost.system/1.87.0/source.json": "470c81ca91d728f1410def4849789a329da81a9080acdca6e1dace58e30728bb", + "https://bcr.bazel.build/modules/boost.throw_exception/1.87.0/MODULE.bazel": "d02c1799ff6bc1bd0a9e7f149ac35a4851c89156be7d81805df9238d52047f02", + "https://bcr.bazel.build/modules/boost.throw_exception/1.87.0/source.json": "b52fb8b064d825ebb7047a72cf2c101a047dc60c1d0a89829b7ed8e39ff4fe6a", + "https://bcr.bazel.build/modules/boost.tokenizer/1.87.0/MODULE.bazel": "48ecacd7bf0fcb7cbf27b55a7d6bf82b988f308666bda2d51840450ea6d62401", + "https://bcr.bazel.build/modules/boost.tokenizer/1.87.0/source.json": "c39ec91706ad8eeab142528eac47737b6fc314b952ffdb9578ab95e5f3c690b4", + "https://bcr.bazel.build/modules/boost.tuple/1.87.0/MODULE.bazel": "94a17666a0d0e875a346b4e8db75ec05e3a1c9c7a681ac5eca80c18e68b5d547", + "https://bcr.bazel.build/modules/boost.tuple/1.87.0/source.json": "5f42023d26b3abefc034817a535d3d0ab06712f4740a93aa4e247287fba1cb47", + "https://bcr.bazel.build/modules/boost.type_index/1.87.0/MODULE.bazel": "a871d18870b21f00c89ba8dd469e027cd697363a9f3dd525176d91e837b8bb38", + "https://bcr.bazel.build/modules/boost.type_index/1.87.0/source.json": "fe14f80f9a857b92af204396d0e81bf57751113e37a77586b9610a7894407092", + "https://bcr.bazel.build/modules/boost.type_traits/1.87.0/MODULE.bazel": "8d2d44e992e85a59b6bd13b145ae27736d932a29e5aec743a0cfd014af5aee27", + "https://bcr.bazel.build/modules/boost.type_traits/1.87.0/source.json": "fd7434b8e36d19a1c8e9349e041ceaf19d0b98e90b6d4c7b86249735907cea34", + "https://bcr.bazel.build/modules/boost.typeof/1.87.0/MODULE.bazel": "c3cd122b8745c835229c58df8c46e81b944996b4bd3822f947873cb617374dd8", + "https://bcr.bazel.build/modules/boost.typeof/1.87.0/source.json": "ba36c7ce360efd31bf7ab5c1503b785de5c8db673056067ff8c7e3e94efccb68", + "https://bcr.bazel.build/modules/boost.unordered/1.87.0/MODULE.bazel": "bfee6daa324bb37c618fc073c50a0754985b9538e13de0e873381d41d634168c", + "https://bcr.bazel.build/modules/boost.unordered/1.87.0/source.json": "3b237fcd1dda18408dbdcb06984e50a13f0688fd0dca480a552f1ff37a6f50b5", + "https://bcr.bazel.build/modules/boost.utility/1.87.0/MODULE.bazel": "8ab710d4feac76acba004a1cac6d64823c812bfeefea18fb7b1a907c86a9ecf6", + "https://bcr.bazel.build/modules/boost.utility/1.87.0/source.json": "ab5744c8cc722dd83c96ae672e01010b944ad4e864e445de66f78164152a7a23", + "https://bcr.bazel.build/modules/boost.variant2/1.87.0/MODULE.bazel": "c0d8e1d486e3080200b74af21f50e4993b0d6dc649ae5700e42fc1d74e1f72b8", + "https://bcr.bazel.build/modules/boost.variant2/1.87.0/source.json": "d57a8992e410f6def5c2e876e53bb21d7907a0df1b9608f59ff90113a4879e67", + "https://bcr.bazel.build/modules/boost.winapi/1.87.0/MODULE.bazel": "b36870b9f3ebe56c1dadd0507fb6ee6b5a59e13c5c0b784baaa509722bd0ffba", + "https://bcr.bazel.build/modules/boost.winapi/1.87.0/source.json": "8e363a11b36f5f78b4d00a4543a8b181313d78abdcc5dec6e438a5c4b2fd2a7e", + "https://bcr.bazel.build/modules/boringssl/0.20240913.0/MODULE.bazel": "fcaa7503a5213290831a91ed1eb538551cf11ac0bc3a6ad92d0fef92c5bd25fb", + "https://bcr.bazel.build/modules/boringssl/0.20240913.0/source.json": "540753d29c271a302442a3d3c6ccd4faace597e7bcf0f77049fe59535782ce9f", + "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", + "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.2/MODULE.bazel": "827f54f492a3ce549c940106d73de332c2b30cebd0c20c0bc5d786aba7f116cb", + "https://bcr.bazel.build/modules/googletest/1.17.0.bcr.2/source.json": "3664514073a819992320ffbce5825e4238459df344d8b01748af2208f8d2e1eb", + "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", + "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", + "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a", + "https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", + "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", + "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", + "https://bcr.bazel.build/modules/pybind11_bazel/2.13.6/MODULE.bazel": "2d746fda559464b253b2b2e6073cb51643a2ac79009ca02100ebbc44b4548656", + "https://bcr.bazel.build/modules/pybind11_bazel/2.13.6/source.json": "6aa0703de8efb20cc897bbdbeb928582ee7beaf278bcd001ac253e1605bddfae", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", + "https://bcr.bazel.build/modules/re2/2025-08-12.bcr.1/MODULE.bazel": "e09b434b122bfb786a69179f9b325e35cb1856c3f56a7a81dd61609260ed46e1", + "https://bcr.bazel.build/modules/re2/2025-08-12.bcr.1/source.json": "a8ae7c09533bf67f9f6e5122d884d5741600b09d78dca6fc0f2f8d2ee0c2d957", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", + "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", + "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", + "https://bcr.bazel.build/modules/rules_cc/0.1.4/MODULE.bazel": "bb03a452a7527ac25a7518fb86a946ef63df860b9657d8323a0c50f8504fb0b9", + "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", + "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", + "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/source.json": "3832f45d145354049137c0090df04629d9c2b5493dc5c2bf46f1834040133a07", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.1.0/MODULE.bazel": "30d9135a2b6561c761bd67bd4990da591e6bdc128790ce3e7afd6a3558b2fb64", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.16.1/MODULE.bazel": "0f20b1cecaa8e52f60a8f071e59a20b4e3b9a67f6c56c802ea256f6face692d3", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", + "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", + "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", + "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", + "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", + "https://bcr.bazel.build/modules/rules_python/0.34.0/MODULE.bazel": "1d623d026e075b78c9fde483a889cda7996f5da4f36dffb24c246ab30f06513a", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", + "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", + "https://bcr.bazel.build/modules/rules_python/1.5.1/MODULE.bazel": "acfe65880942d44a69129d4c5c3122d57baaf3edf58ae5a6bd4edea114906bf5", + "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", + "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.7.0/source.json": "028a084b65dcf8f4dc4f82f8778dbe65df133f234b316828a82e060d81bdce32", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", + "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", + "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", + "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", + "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "Ga4z8lQy1YQ5rAMy+dOl0dqcCEBnYNCXku8x3YQmDZI=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedInputs": [ + "REPO_MAPPING:rules_kotlin+,bazel_tools bazel_tools" + ], + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + } + } + }, + "@@rules_python+//python/extensions:config.bzl%config": { + "general": { + "bzlTransitiveDigest": "iibnRYgg8LpcfmH7EAnVwYePC3jsVaJ6Id8XxUjSZps=", + "usagesDigest": "ZVSXMAGpD+xzVNPuvF1IoLBkty7TROO0+akMapt1pAg=", + "recordedInputs": [ + "REPO_MAPPING:rules_python+,bazel_tools bazel_tools", + "REPO_MAPPING:rules_python+,pypi__build rules_python++config+pypi__build", + "REPO_MAPPING:rules_python+,pypi__click rules_python++config+pypi__click", + "REPO_MAPPING:rules_python+,pypi__colorama rules_python++config+pypi__colorama", + "REPO_MAPPING:rules_python+,pypi__importlib_metadata rules_python++config+pypi__importlib_metadata", + "REPO_MAPPING:rules_python+,pypi__installer rules_python++config+pypi__installer", + "REPO_MAPPING:rules_python+,pypi__more_itertools rules_python++config+pypi__more_itertools", + "REPO_MAPPING:rules_python+,pypi__packaging rules_python++config+pypi__packaging", + "REPO_MAPPING:rules_python+,pypi__pep517 rules_python++config+pypi__pep517", + "REPO_MAPPING:rules_python+,pypi__pip rules_python++config+pypi__pip", + "REPO_MAPPING:rules_python+,pypi__pip_tools rules_python++config+pypi__pip_tools", + "REPO_MAPPING:rules_python+,pypi__pyproject_hooks rules_python++config+pypi__pyproject_hooks", + "REPO_MAPPING:rules_python+,pypi__setuptools rules_python++config+pypi__setuptools", + "REPO_MAPPING:rules_python+,pypi__tomli rules_python++config+pypi__tomli", + "REPO_MAPPING:rules_python+,pypi__wheel rules_python++config+pypi__wheel", + "REPO_MAPPING:rules_python+,pypi__zipp rules_python++config+pypi__zipp" + ], + "generatedRepoSpecs": { + "rules_python_internal": { + "repoRuleId": "@@rules_python+//python/private:internal_config_repo.bzl%internal_config_repo", + "attributes": { + "transition_setting_generators": {}, + "transition_settings": [] + } + }, + "pypi__build": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl", + "sha256": "75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__click": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", + "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__colorama": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", + "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__importlib_metadata": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl", + "sha256": "30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__installer": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", + "sha256": "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__more_itertools": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/50/e2/8e10e465ee3987bb7c9ab69efb91d867d93959095f4807db102d07995d94/more_itertools-10.2.0-py3-none-any.whl", + "sha256": "686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__packaging": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", + "sha256": "2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pep517": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/25/6e/ca4a5434eb0e502210f591b97537d322546e4833dcb4d470a48c375c5540/pep517-0.13.1-py3-none-any.whl", + "sha256": "31b206f67165b3536dd577c5c3f1518e8fbaf38cbc57efff8369a392feff1721", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pip": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/8a/6a/19e9fe04fca059ccf770861c7d5721ab4c2aebc539889e97c7977528a53b/pip-24.0-py3-none-any.whl", + "sha256": "ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pip_tools": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl", + "sha256": "4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pyproject_hooks": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl", + "sha256": "7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__setuptools": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/90/99/158ad0609729111163fc1f674a5a42f2605371a4cf036d0441070e2f7455/setuptools-78.1.1-py3-none-any.whl", + "sha256": "c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__tomli": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", + "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__wheel": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/7d/cd/d7460c9a869b16c3dd4e1e403cce337df165368c71d6af229a74699622ce/wheel-0.43.0-py3-none-any.whl", + "sha256": "55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__zipp": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "url": "https://files.pythonhosted.org/packages/da/55/a03fd7240714916507e1fcf7ae355bd9d9ed2e6db492595f1a67f61681be/zipp-3.18.2-py3-none-any.whl", + "sha256": "dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + } + } + } + }, + "@@rules_python+//python/uv:uv.bzl%uv": { + "general": { + "bzlTransitiveDigest": "ijW9KS7qsIY+yBVvJ+Nr1mzwQox09j13DnE3iIwaeTM=", + "usagesDigest": "H8dQoNZcoqP+Mu0tHZTi4KHATzvNkM5ePuEqoQdklIU=", + "recordedInputs": [ + "REPO_MAPPING:rules_python+,bazel_tools bazel_tools", + "REPO_MAPPING:rules_python+,platforms platforms" + ], + "generatedRepoSpecs": { + "uv": { + "repoRuleId": "@@rules_python+//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo", + "attributes": { + "toolchain_type": "'@@rules_python+//python/uv:uv_toolchain_type'", + "toolchain_names": [ + "none" + ], + "toolchain_implementations": { + "none": "'@@rules_python+//python:none'" + }, + "toolchain_compatible_with": { + "none": [ + "@platforms//:incompatible" + ] + }, + "toolchain_target_settings": {} + } + } + } + } + } + }, + "facts": {} +} diff --git a/examples/bazel-consumer/model/todo.smithy b/examples/bazel-consumer/model/todo.smithy new file mode 100644 index 00000000..041181f7 --- /dev/null +++ b/examples/bazel-consumer/model/todo.smithy @@ -0,0 +1,59 @@ +$version: "2.0" + +namespace acme.todo + +use aws.protocols#restJson1 + +/// A deliberately small service: enough to show routing, bodies, constraint +/// validation, and a modeled error end to end. +@restJson1 +service Todo { + version: "2026-01-01" + operations: [AddTask, GetTask] +} + +@http(method: "POST", uri: "/tasks") +operation AddTask { + input := { + @required + @length(min: 1, max: 256) + title: String + } + + output := { + @required + taskId: String + + @required + title: String + } +} + +@readonly +@http(method: "GET", uri: "/tasks/{taskId}") +operation GetTask { + input := { + @required + @httpLabel + taskId: String + } + + output := { + @required + taskId: String + + @required + title: String + + done: Boolean + } + + errors: [NoSuchTask] +} + +@error("client") +@httpError(404) +structure NoSuchTask { + @required + message: String +} diff --git a/examples/bazel-consumer/todo_integration_test.cc b/examples/bazel-consumer/todo_integration_test.cc new file mode 100644 index 00000000..88cf50a8 --- /dev/null +++ b/examples/bazel-consumer/todo_integration_test.cc @@ -0,0 +1,111 @@ +// The consumer-side integration test the quick start walks through: implement +// the generated handler, then drive the generated server with the generated +// client over the loopback transport and a real socket. + +#include + +#include +#include +#include + +#include "acme/todo/client.h" +#include "acme/todo/server.h" +#include "smithy/client/config.h" +#include "smithy/http/loopback.h" +#include "smithy/http/socket_transport.h" + +namespace { + +using acme::todo::AddTaskInput; +using acme::todo::AddTaskOutput; +using acme::todo::GetTaskInput; +using acme::todo::GetTaskOutput; +using acme::todo::NoSuchTask; +using acme::todo::TodoClient; +using acme::todo::TodoHandler; +using acme::todo::TodoServer; + +class InMemoryHandler final : public TodoHandler { + public: + smithy::Outcome AddTask(const AddTaskInput& input) override { + const std::string id = "task-" + std::to_string(next_id_++); + titles_[id] = input.title; + return AddTaskOutput{.taskId = id, .title = input.title}; + } + + smithy::Outcome GetTask(const GetTaskInput& input) override { + const auto it = titles_.find(input.taskId); + if (it == titles_.end()) { + smithy::Error error = smithy::Error::Modeled("NoSuchTask", "no task: " + input.taskId); + error.set_detail(NoSuchTask{.message = "no task: " + input.taskId}); + return error; + } + return GetTaskOutput{.taskId = input.taskId, .title = it->second, .done = false}; + } + + private: + int next_id_ = 1; + std::map titles_; +}; + +enum class Transport { kLoopback, kSocket }; + +class TodoIntegrationTest : public ::testing::TestWithParam { + protected: + void SetUp() override { + server_ = std::make_unique(std::make_shared()); + smithy::ClientConfig config; + if (GetParam() == Transport::kLoopback) { + auto loopback = std::make_shared(); + ASSERT_TRUE(loopback->Start(server_->Handler()).ok()); + config.http_client = loopback; + } else { + socket_server_ = std::make_unique(); + ASSERT_TRUE(socket_server_->Start(server_->Handler()).ok()); + config.endpoint = "http://127.0.0.1:" + std::to_string(socket_server_->port()); + } + auto client = TodoClient::Create(std::move(config)); + ASSERT_TRUE(client.ok()) << client.error().message(); + client_ = std::make_unique(std::move(*client)); + } + + void TearDown() override { + if (socket_server_ != nullptr) socket_server_->Stop(); + } + + std::unique_ptr server_; + std::unique_ptr socket_server_; + std::unique_ptr client_; +}; + +TEST_P(TodoIntegrationTest, AddThenGetRoundTrips) { + const auto added = client_->AddTask(AddTaskInput{.title = "write the quick start"}); + ASSERT_TRUE(added.ok()) << added.error().message(); + EXPECT_EQ(added->title, "write the quick start"); + + const auto fetched = client_->GetTask(GetTaskInput{.taskId = added->taskId}); + ASSERT_TRUE(fetched.ok()) << fetched.error().message(); + EXPECT_EQ(fetched->title, "write the quick start"); +} + +TEST_P(TodoIntegrationTest, ModeledErrorsSurfaceTyped) { + const auto missing = client_->GetTask(GetTaskInput{.taskId = "nope"}); + ASSERT_FALSE(missing.ok()); + EXPECT_EQ(missing.error().code(), "NoSuchTask"); + ASSERT_NE(missing.error().detail(), nullptr); + EXPECT_EQ(missing.error().detail()->message, "no task: nope"); +} + +TEST_P(TodoIntegrationTest, ConstraintValidationRejectsBeforeTheHandler) { + // @length(min: 1) on title: the framework answers 400 ValidationException. + const auto rejected = client_->AddTask(AddTaskInput{.title = ""}); + ASSERT_FALSE(rejected.ok()); +} + +INSTANTIATE_TEST_SUITE_P(Transports, TodoIntegrationTest, + ::testing::Values(Transport::kLoopback, Transport::kSocket), + [](const auto& info) { + return info.param == Transport::kLoopback ? "Loopback" : "Socket"; + }); + +} // namespace diff --git a/maven_install.json b/maven_install.json new file mode 100644 index 00000000..cb4b944a --- /dev/null +++ b/maven_install.json @@ -0,0 +1,463 @@ +{ + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", + "__INPUT_ARTIFACTS_HASH": -143088587, + "__RESOLVED_ARTIFACTS_HASH": -1038359821, + "artifacts": { + "software.amazon.smithy:smithy-aws-traits": { + "shasums": { + "jar": "b38776fb783d4e1d8e2768de1cc6447fc371c715da248108731b76bf88226fa7" + }, + "version": "1.53.0" + }, + "software.amazon.smithy:smithy-build": { + "shasums": { + "jar": "ab7c0dad8619f9fc3913288dc7a925ba935c85fec3aac674fe34c3b3d4d82f10" + }, + "version": "1.53.0" + }, + "software.amazon.smithy:smithy-codegen-core": { + "shasums": { + "jar": "5ec3981b971074e7cc6172b72437cff317bf5c4ad351ba535366cc409627be18" + }, + "version": "1.53.0" + }, + "software.amazon.smithy:smithy-diff": { + "shasums": { + "jar": "0e162d833ab0a0e9275fd6aeec927437931d20a9c402e20817634ae41b305b1f" + }, + "version": "1.53.0" + }, + "software.amazon.smithy:smithy-model": { + "shasums": { + "jar": "b2e9ef0b0bb0580c9494853ee5b5f7735714f8c27b53d402af7a457209df1438" + }, + "version": "1.53.0" + }, + "software.amazon.smithy:smithy-protocol-test-traits": { + "shasums": { + "jar": "ca211228877a452ca53b0081c592ef212cfa6ef16f72a2e8436c752e441ce5a4" + }, + "version": "1.53.0" + }, + "software.amazon.smithy:smithy-protocol-traits": { + "shasums": { + "jar": "bc1f446f6d6170cd3547a3ae61257601cd231dd8b49ce35156267f52f35bafec" + }, + "version": "1.53.0" + }, + "software.amazon.smithy:smithy-utils": { + "shasums": { + "jar": "92f77246a50ada8399038d13e294b7ac8152fd11d2fccfc667ad1bafe278406b" + }, + "version": "1.53.0" + } + }, + "dependencies": { + "software.amazon.smithy:smithy-aws-traits": [ + "software.amazon.smithy:smithy-diff", + "software.amazon.smithy:smithy-model" + ], + "software.amazon.smithy:smithy-build": [ + "software.amazon.smithy:smithy-model", + "software.amazon.smithy:smithy-utils" + ], + "software.amazon.smithy:smithy-codegen-core": [ + "software.amazon.smithy:smithy-build", + "software.amazon.smithy:smithy-model", + "software.amazon.smithy:smithy-utils" + ], + "software.amazon.smithy:smithy-diff": [ + "software.amazon.smithy:smithy-model", + "software.amazon.smithy:smithy-utils" + ], + "software.amazon.smithy:smithy-model": [ + "software.amazon.smithy:smithy-utils" + ], + "software.amazon.smithy:smithy-protocol-test-traits": [ + "software.amazon.smithy:smithy-model" + ], + "software.amazon.smithy:smithy-protocol-traits": [ + "software.amazon.smithy:smithy-model", + "software.amazon.smithy:smithy-utils" + ] + }, + "packages": { + "software.amazon.smithy:smithy-aws-traits": [ + "software.amazon.smithy.aws.traits", + "software.amazon.smithy.aws.traits.auth", + "software.amazon.smithy.aws.traits.auth.diff", + "software.amazon.smithy.aws.traits.clientendpointdiscovery", + "software.amazon.smithy.aws.traits.customizations", + "software.amazon.smithy.aws.traits.protocols", + "software.amazon.smithy.aws.traits.tagging" + ], + "software.amazon.smithy:smithy-build": [ + "software.amazon.smithy.build", + "software.amazon.smithy.build.model", + "software.amazon.smithy.build.plugins", + "software.amazon.smithy.build.processor", + "software.amazon.smithy.build.transforms" + ], + "software.amazon.smithy:smithy-codegen-core": [ + "software.amazon.smithy.codegen.core", + "software.amazon.smithy.codegen.core.directed", + "software.amazon.smithy.codegen.core.trace", + "software.amazon.smithy.codegen.core.writer" + ], + "software.amazon.smithy:smithy-diff": [ + "software.amazon.smithy.diff", + "software.amazon.smithy.diff.evaluators", + "software.amazon.smithy.diff.testrunner" + ], + "software.amazon.smithy:smithy-model": [ + "software.amazon.smithy.model", + "software.amazon.smithy.model.knowledge", + "software.amazon.smithy.model.loader", + "software.amazon.smithy.model.loader.sourcecontext", + "software.amazon.smithy.model.neighbor", + "software.amazon.smithy.model.node", + "software.amazon.smithy.model.node.internal", + "software.amazon.smithy.model.pattern", + "software.amazon.smithy.model.selector", + "software.amazon.smithy.model.shapes", + "software.amazon.smithy.model.traits", + "software.amazon.smithy.model.traits.synthetic", + "software.amazon.smithy.model.transform", + "software.amazon.smithy.model.transform.plugins", + "software.amazon.smithy.model.validation", + "software.amazon.smithy.model.validation.linters", + "software.amazon.smithy.model.validation.node", + "software.amazon.smithy.model.validation.suppressions", + "software.amazon.smithy.model.validation.testrunner", + "software.amazon.smithy.model.validation.validators" + ], + "software.amazon.smithy:smithy-protocol-test-traits": [ + "software.amazon.smithy.protocoltests.traits" + ], + "software.amazon.smithy:smithy-protocol-traits": [ + "software.amazon.smithy.protocol.traits" + ], + "software.amazon.smithy:smithy-utils": [ + "software.amazon.smithy.utils" + ] + }, + "repositories": { + "https://repo1.maven.org/maven2/": [ + "software.amazon.smithy:smithy-aws-traits", + "software.amazon.smithy:smithy-build", + "software.amazon.smithy:smithy-codegen-core", + "software.amazon.smithy:smithy-diff", + "software.amazon.smithy:smithy-model", + "software.amazon.smithy:smithy-protocol-test-traits", + "software.amazon.smithy:smithy-protocol-traits", + "software.amazon.smithy:smithy-utils" + ] + }, + "services": { + "software.amazon.smithy:smithy-aws-traits": { + "software.amazon.smithy.diff.DiffEvaluator": [ + "software.amazon.smithy.aws.traits.auth.diff.SigV4Migration" + ], + "software.amazon.smithy.model.traits.TraitService": [ + "software.amazon.smithy.aws.traits.ArnReferenceTrait$Provider", + "software.amazon.smithy.aws.traits.ArnTrait$Provider", + "software.amazon.smithy.aws.traits.ControlPlaneTrait$Provider", + "software.amazon.smithy.aws.traits.DataPlaneTrait$Provider", + "software.amazon.smithy.aws.traits.DataTrait$Provider", + "software.amazon.smithy.aws.traits.HttpChecksumTrait$Provider", + "software.amazon.smithy.aws.traits.ServiceTrait$Provider", + "software.amazon.smithy.aws.traits.auth.CognitoUserPoolsTrait$Provider", + "software.amazon.smithy.aws.traits.auth.SigV4ATrait$Provider", + "software.amazon.smithy.aws.traits.auth.SigV4Trait$Provider", + "software.amazon.smithy.aws.traits.auth.UnsignedPayloadTrait$Provider", + "software.amazon.smithy.aws.traits.clientendpointdiscovery.ClientDiscoveredEndpointTrait$Provider", + "software.amazon.smithy.aws.traits.clientendpointdiscovery.ClientEndpointDiscoveryIdTrait$Provider", + "software.amazon.smithy.aws.traits.clientendpointdiscovery.ClientEndpointDiscoveryTrait$Provider", + "software.amazon.smithy.aws.traits.customizations.S3UnwrappedXmlOutputTrait$Provider", + "software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait$Provider", + "software.amazon.smithy.aws.traits.protocols.AwsJson1_1Trait$Provider", + "software.amazon.smithy.aws.traits.protocols.AwsQueryCompatibleTrait$Provider", + "software.amazon.smithy.aws.traits.protocols.AwsQueryErrorTrait$Provider", + "software.amazon.smithy.aws.traits.protocols.AwsQueryTrait$Provider", + "software.amazon.smithy.aws.traits.protocols.Ec2QueryNameTrait$Provider", + "software.amazon.smithy.aws.traits.protocols.Ec2QueryTrait$Provider", + "software.amazon.smithy.aws.traits.protocols.RestJson1Trait$Provider", + "software.amazon.smithy.aws.traits.protocols.RestXmlTrait$Provider", + "software.amazon.smithy.aws.traits.tagging.TagEnabledTrait$Provider", + "software.amazon.smithy.aws.traits.tagging.TaggableTrait$Provider" + ], + "software.amazon.smithy.model.transform.ModelTransformerPlugin": [ + "software.amazon.smithy.aws.traits.clientendpointdiscovery.CleanClientDiscoveryTraitTransformer" + ], + "software.amazon.smithy.model.validation.Validator": [ + "software.amazon.smithy.aws.traits.ArnTemplateValidator", + "software.amazon.smithy.aws.traits.ArnTraitValidator", + "software.amazon.smithy.aws.traits.ErrorRenameValidator", + "software.amazon.smithy.aws.traits.EventSourceValidator", + "software.amazon.smithy.aws.traits.HttpChecksumTraitValidator", + "software.amazon.smithy.aws.traits.SdkServiceIdValidator", + "software.amazon.smithy.aws.traits.auth.SigV4TraitsValidator", + "software.amazon.smithy.aws.traits.clientendpointdiscovery.ClientEndpointDiscoveryValidator", + "software.amazon.smithy.aws.traits.protocols.ProtocolHttpPayloadValidator", + "software.amazon.smithy.aws.traits.protocols.ProtocolHttpValidator", + "software.amazon.smithy.aws.traits.tagging.ServiceTaggingValidator", + "software.amazon.smithy.aws.traits.tagging.TagEnabledServiceValidator", + "software.amazon.smithy.aws.traits.tagging.TagResourcePropertyNameValidator", + "software.amazon.smithy.aws.traits.tagging.TagResourcePropertyTypeValidator", + "software.amazon.smithy.aws.traits.tagging.TaggableResourceValidator" + ] + }, + "software.amazon.smithy:smithy-build": { + "software.amazon.smithy.build.ProjectionTransformer": [ + "software.amazon.smithy.build.transforms.Apply", + "software.amazon.smithy.build.transforms.ChangeStringEnumsToEnumShapes", + "software.amazon.smithy.build.transforms.ChangeTypes", + "software.amazon.smithy.build.transforms.ExcludeMetadata", + "software.amazon.smithy.build.transforms.ExcludeShapesBySelector", + "software.amazon.smithy.build.transforms.ExcludeShapesByTag", + "software.amazon.smithy.build.transforms.ExcludeShapesByTrait", + "software.amazon.smithy.build.transforms.ExcludeTags", + "software.amazon.smithy.build.transforms.ExcludeTraits", + "software.amazon.smithy.build.transforms.ExcludeTraitsByTag", + "software.amazon.smithy.build.transforms.FilterSuppressions", + "software.amazon.smithy.build.transforms.FlattenNamespaces", + "software.amazon.smithy.build.transforms.IncludeMetadata", + "software.amazon.smithy.build.transforms.IncludeNamespaces", + "software.amazon.smithy.build.transforms.IncludeServices", + "software.amazon.smithy.build.transforms.IncludeShapesBySelector", + "software.amazon.smithy.build.transforms.IncludeShapesByTag", + "software.amazon.smithy.build.transforms.IncludeTags", + "software.amazon.smithy.build.transforms.IncludeTraits", + "software.amazon.smithy.build.transforms.IncludeTraitsByTag", + "software.amazon.smithy.build.transforms.MakeIdempotencyTokensClientOptional", + "software.amazon.smithy.build.transforms.RemoveDeprecatedShapes", + "software.amazon.smithy.build.transforms.RemoveTraitDefinitions", + "software.amazon.smithy.build.transforms.RemoveUnusedShapes", + "software.amazon.smithy.build.transforms.RenameShapes" + ], + "software.amazon.smithy.build.SmithyBuildPlugin": [ + "software.amazon.smithy.build.plugins.BuildInfoPlugin", + "software.amazon.smithy.build.plugins.ModelPlugin", + "software.amazon.smithy.build.plugins.NullabilityReportPlugin", + "software.amazon.smithy.build.plugins.RunPlugin", + "software.amazon.smithy.build.plugins.SourcesPlugin" + ] + }, + "software.amazon.smithy:smithy-diff": { + "software.amazon.smithy.diff.DiffEvaluator": [ + "software.amazon.smithy.diff.evaluators.AddedEntityBinding", + "software.amazon.smithy.diff.evaluators.AddedMetadata", + "software.amazon.smithy.diff.evaluators.AddedOperationError", + "software.amazon.smithy.diff.evaluators.AddedRequiredMember", + "software.amazon.smithy.diff.evaluators.AddedServiceError", + "software.amazon.smithy.diff.evaluators.AddedShape", + "software.amazon.smithy.diff.evaluators.AddedTraitDefinition", + "software.amazon.smithy.diff.evaluators.ChangedDefault", + "software.amazon.smithy.diff.evaluators.ChangedEnumTrait", + "software.amazon.smithy.diff.evaluators.ChangedLengthTrait", + "software.amazon.smithy.diff.evaluators.ChangedMemberOrder", + "software.amazon.smithy.diff.evaluators.ChangedMemberTarget", + "software.amazon.smithy.diff.evaluators.ChangedMetadata", + "software.amazon.smithy.diff.evaluators.ChangedNullability", + "software.amazon.smithy.diff.evaluators.ChangedOperationInput", + "software.amazon.smithy.diff.evaluators.ChangedOperationOutput", + "software.amazon.smithy.diff.evaluators.ChangedRangeTrait", + "software.amazon.smithy.diff.evaluators.ChangedResourceIdentifiers", + "software.amazon.smithy.diff.evaluators.ChangedShapeType", + "software.amazon.smithy.diff.evaluators.ModifiedTrait", + "software.amazon.smithy.diff.evaluators.RemovedAuthenticationScheme", + "software.amazon.smithy.diff.evaluators.RemovedEntityBinding", + "software.amazon.smithy.diff.evaluators.RemovedMetadata", + "software.amazon.smithy.diff.evaluators.RemovedOperationError", + "software.amazon.smithy.diff.evaluators.RemovedServiceError", + "software.amazon.smithy.diff.evaluators.RemovedShape", + "software.amazon.smithy.diff.evaluators.RemovedTraitDefinition", + "software.amazon.smithy.diff.evaluators.ServiceRename", + "software.amazon.smithy.diff.evaluators.TraitBreakingChange" + ] + }, + "software.amazon.smithy:smithy-model": { + "software.amazon.smithy.model.traits.TraitService": [ + "software.amazon.smithy.model.traits.AddedDefaultTrait$Provider", + "software.amazon.smithy.model.traits.AuthDefinitionTrait$Provider", + "software.amazon.smithy.model.traits.AuthTrait$Provider", + "software.amazon.smithy.model.traits.BoxTrait$Provider", + "software.amazon.smithy.model.traits.ClientOptionalTrait$Provider", + "software.amazon.smithy.model.traits.CorsTrait$Provider", + "software.amazon.smithy.model.traits.DefaultTrait$Provider", + "software.amazon.smithy.model.traits.DeprecatedTrait$Provider", + "software.amazon.smithy.model.traits.DocumentationTrait$Provider", + "software.amazon.smithy.model.traits.EndpointTrait$Provider", + "software.amazon.smithy.model.traits.EnumTrait$Provider", + "software.amazon.smithy.model.traits.EnumValueTrait$Provider", + "software.amazon.smithy.model.traits.ErrorTrait$Provider", + "software.amazon.smithy.model.traits.EventHeaderTrait$Provider", + "software.amazon.smithy.model.traits.EventPayloadTrait$Provider", + "software.amazon.smithy.model.traits.ExamplesTrait$Provider", + "software.amazon.smithy.model.traits.ExternalDocumentationTrait$Provider", + "software.amazon.smithy.model.traits.HostLabelTrait$Provider", + "software.amazon.smithy.model.traits.HttpApiKeyAuthTrait$Provider", + "software.amazon.smithy.model.traits.HttpBasicAuthTrait$Provider", + "software.amazon.smithy.model.traits.HttpBearerAuthTrait$Provider", + "software.amazon.smithy.model.traits.HttpChecksumRequiredTrait$Provider", + "software.amazon.smithy.model.traits.HttpDigestAuthTrait$Provider", + "software.amazon.smithy.model.traits.HttpErrorTrait$Provider", + "software.amazon.smithy.model.traits.HttpHeaderTrait$Provider", + "software.amazon.smithy.model.traits.HttpLabelTrait$Provider", + "software.amazon.smithy.model.traits.HttpPayloadTrait$Provider", + "software.amazon.smithy.model.traits.HttpPrefixHeadersTrait$Provider", + "software.amazon.smithy.model.traits.HttpQueryParamsTrait$Provider", + "software.amazon.smithy.model.traits.HttpQueryTrait$Provider", + "software.amazon.smithy.model.traits.HttpResponseCodeTrait$Provider", + "software.amazon.smithy.model.traits.HttpTrait$Provider", + "software.amazon.smithy.model.traits.IdRefTrait$Provider", + "software.amazon.smithy.model.traits.IdempotencyTokenTrait$Provider", + "software.amazon.smithy.model.traits.IdempotentTrait$Provider", + "software.amazon.smithy.model.traits.InputTrait$Provider", + "software.amazon.smithy.model.traits.InternalTrait$Provider", + "software.amazon.smithy.model.traits.JsonNameTrait$Provider", + "software.amazon.smithy.model.traits.LengthTrait$Provider", + "software.amazon.smithy.model.traits.MediaTypeTrait$Provider", + "software.amazon.smithy.model.traits.MixinTrait$Provider", + "software.amazon.smithy.model.traits.NestedPropertiesTrait$Provider", + "software.amazon.smithy.model.traits.NoReplaceTrait$Provider", + "software.amazon.smithy.model.traits.NotPropertyTrait$Provider", + "software.amazon.smithy.model.traits.OptionalAuthTrait$Provider", + "software.amazon.smithy.model.traits.OutputTrait$Provider", + "software.amazon.smithy.model.traits.PaginatedTrait$Provider", + "software.amazon.smithy.model.traits.PatternTrait$Provider", + "software.amazon.smithy.model.traits.PrivateTrait$Provider", + "software.amazon.smithy.model.traits.PropertyTrait$Provider", + "software.amazon.smithy.model.traits.ProtocolDefinitionTrait$Provider", + "software.amazon.smithy.model.traits.RangeTrait$Provider", + "software.amazon.smithy.model.traits.ReadonlyTrait$Provider", + "software.amazon.smithy.model.traits.RecommendedTrait$Provider", + "software.amazon.smithy.model.traits.ReferencesTrait$Provider", + "software.amazon.smithy.model.traits.RequestCompressionTrait$Provider", + "software.amazon.smithy.model.traits.RequiredTrait$Provider", + "software.amazon.smithy.model.traits.RequiresLengthTrait$Provider", + "software.amazon.smithy.model.traits.ResourceIdentifierTrait$Provider", + "software.amazon.smithy.model.traits.RetryableTrait$Provider", + "software.amazon.smithy.model.traits.SensitiveTrait$Provider", + "software.amazon.smithy.model.traits.SinceTrait$Provider", + "software.amazon.smithy.model.traits.SparseTrait$Provider", + "software.amazon.smithy.model.traits.StreamingTrait$Provider", + "software.amazon.smithy.model.traits.SuppressTrait$Provider", + "software.amazon.smithy.model.traits.TagsTrait$Provider", + "software.amazon.smithy.model.traits.TimestampFormatTrait$Provider", + "software.amazon.smithy.model.traits.TitleTrait$Provider", + "software.amazon.smithy.model.traits.TraitDefinition$Provider", + "software.amazon.smithy.model.traits.TraitValidatorsTrait$Provider", + "software.amazon.smithy.model.traits.UniqueItemsTrait$Provider", + "software.amazon.smithy.model.traits.UnitTypeTrait$Provider", + "software.amazon.smithy.model.traits.UnstableTrait$Provider", + "software.amazon.smithy.model.traits.XmlAttributeTrait$Provider", + "software.amazon.smithy.model.traits.XmlFlattenedTrait$Provider", + "software.amazon.smithy.model.traits.XmlNameTrait$Provider", + "software.amazon.smithy.model.traits.XmlNamespaceTrait$Provider" + ], + "software.amazon.smithy.model.transform.ModelTransformerPlugin": [ + "software.amazon.smithy.model.transform.plugins.CleanBindings", + "software.amazon.smithy.model.transform.plugins.CleanOperationStructures", + "software.amazon.smithy.model.transform.plugins.CleanResourceReferences", + "software.amazon.smithy.model.transform.plugins.CleanServiceRenames", + "software.amazon.smithy.model.transform.plugins.CleanStructureAndUnionMembers", + "software.amazon.smithy.model.transform.plugins.CleanTraitDefinitions", + "software.amazon.smithy.model.transform.plugins.RemoveMixins", + "software.amazon.smithy.model.transform.plugins.RemoveTraits" + ], + "software.amazon.smithy.model.validation.Validator": [ + "software.amazon.smithy.model.validation.validators.AuthTraitValidator", + "software.amazon.smithy.model.validation.validators.DefaultTraitValidator", + "software.amazon.smithy.model.validation.validators.DefaultValueInUpdateValidator", + "software.amazon.smithy.model.validation.validators.DeprecatedTraitValidator", + "software.amazon.smithy.model.validation.validators.EnumShapeValidator", + "software.amazon.smithy.model.validation.validators.EnumTraitValidator", + "software.amazon.smithy.model.validation.validators.EventPayloadTraitValidator", + "software.amazon.smithy.model.validation.validators.ExamplesTraitValidator", + "software.amazon.smithy.model.validation.validators.ExclusiveStructureMemberTraitValidator", + "software.amazon.smithy.model.validation.validators.HostLabelTraitValidator", + "software.amazon.smithy.model.validation.validators.HttpApiKeyAuthTraitValidator", + "software.amazon.smithy.model.validation.validators.HttpBindingTraitIgnoredValidator", + "software.amazon.smithy.model.validation.validators.HttpBindingsMissingValidator", + "software.amazon.smithy.model.validation.validators.HttpHeaderTraitValidator", + "software.amazon.smithy.model.validation.validators.HttpLabelTraitValidator", + "software.amazon.smithy.model.validation.validators.HttpMethodSemanticsValidator", + "software.amazon.smithy.model.validation.validators.HttpPayloadValidator", + "software.amazon.smithy.model.validation.validators.HttpPrefixHeadersTraitValidator", + "software.amazon.smithy.model.validation.validators.HttpQueryParamsTraitValidator", + "software.amazon.smithy.model.validation.validators.HttpQueryTraitValidator", + "software.amazon.smithy.model.validation.validators.HttpResponseCodeSemanticsValidator", + "software.amazon.smithy.model.validation.validators.HttpUriConflictValidator", + "software.amazon.smithy.model.validation.validators.HttpUriFormatValidator", + "software.amazon.smithy.model.validation.validators.HttpUriGreedyLabelValidator", + "software.amazon.smithy.model.validation.validators.IdempotencyTokenIgnoredValidator", + "software.amazon.smithy.model.validation.validators.JsonNameValidator", + "software.amazon.smithy.model.validation.validators.LengthTraitValidator", + "software.amazon.smithy.model.validation.validators.MediaTypeValidator", + "software.amazon.smithy.model.validation.validators.MemberShouldReferenceResourceValidator", + "software.amazon.smithy.model.validation.validators.NoInlineDocumentSupportValidator", + "software.amazon.smithy.model.validation.validators.OperationValidator", + "software.amazon.smithy.model.validation.validators.PaginatedTraitValidator", + "software.amazon.smithy.model.validation.validators.PatternTraitValidator", + "software.amazon.smithy.model.validation.validators.PrivateAccessValidator", + "software.amazon.smithy.model.validation.validators.RangeTraitValidator", + "software.amazon.smithy.model.validation.validators.ReferencesTraitValidator", + "software.amazon.smithy.model.validation.validators.RequestCompressionTraitValidator", + "software.amazon.smithy.model.validation.validators.ResourceCycleValidator", + "software.amazon.smithy.model.validation.validators.ResourceIdentifierBindingValidator", + "software.amazon.smithy.model.validation.validators.ResourceIdentifierValidator", + "software.amazon.smithy.model.validation.validators.ResourceLifecycleValidator", + "software.amazon.smithy.model.validation.validators.ResourceOperationInputOutputValidator", + "software.amazon.smithy.model.validation.validators.ServiceAuthDefinitionsValidator", + "software.amazon.smithy.model.validation.validators.ServiceBoundResourceOperationValidator", + "software.amazon.smithy.model.validation.validators.ServiceValidator", + "software.amazon.smithy.model.validation.validators.SetValidator", + "software.amazon.smithy.model.validation.validators.ShapeIdConflictValidator", + "software.amazon.smithy.model.validation.validators.ShapeRecursionValidator", + "software.amazon.smithy.model.validation.validators.SingleOperationBindingValidator", + "software.amazon.smithy.model.validation.validators.SingleResourceBindingValidator", + "software.amazon.smithy.model.validation.validators.StreamingTraitValidator", + "software.amazon.smithy.model.validation.validators.TargetValidator", + "software.amazon.smithy.model.validation.validators.TraitBreakingChangesValidator", + "software.amazon.smithy.model.validation.validators.TraitConflictValidator", + "software.amazon.smithy.model.validation.validators.TraitTargetValidator", + "software.amazon.smithy.model.validation.validators.TraitValidatorsValidator", + "software.amazon.smithy.model.validation.validators.TraitValueValidator", + "software.amazon.smithy.model.validation.validators.UnionValidator", + "software.amazon.smithy.model.validation.validators.UnitTypeValidator", + "software.amazon.smithy.model.validation.validators.UnstableTraitValidator", + "software.amazon.smithy.model.validation.validators.XmlFlattenedTraitValidator", + "software.amazon.smithy.model.validation.validators.XmlNamespaceTraitValidator" + ], + "software.amazon.smithy.model.validation.ValidatorService": [ + "software.amazon.smithy.model.validation.linters.EmitEachSelectorValidator$Provider", + "software.amazon.smithy.model.validation.linters.EmitNoneSelectorValidator$Provider", + "software.amazon.smithy.model.validation.linters.UnreferencedShapeValidator$Provider" + ] + }, + "software.amazon.smithy:smithy-protocol-test-traits": { + "software.amazon.smithy.model.traits.TraitService": [ + "software.amazon.smithy.protocoltests.traits.HttpMalformedRequestTestsTrait$Provider", + "software.amazon.smithy.protocoltests.traits.HttpRequestTestsTrait$Provider", + "software.amazon.smithy.protocoltests.traits.HttpResponseTestsTrait$Provider" + ], + "software.amazon.smithy.model.validation.Validator": [ + "software.amazon.smithy.protocoltests.traits.HttpMalformedRequestTestsValidator", + "software.amazon.smithy.protocoltests.traits.HttpRequestTestsInputValidator", + "software.amazon.smithy.protocoltests.traits.HttpResponseTestsErrorValidator", + "software.amazon.smithy.protocoltests.traits.HttpResponseTestsOutputValidator", + "software.amazon.smithy.protocoltests.traits.UniqueProtocolTestCaseIdValidator" + ] + }, + "software.amazon.smithy:smithy-protocol-traits": { + "software.amazon.smithy.model.traits.TraitService": [ + "software.amazon.smithy.protocol.traits.Rpcv2CborTrait$Provider" + ], + "software.amazon.smithy.model.validation.Validator": [ + "software.amazon.smithy.protocol.traits.Rpcv2CborTraitValidator" + ] + } + }, + "version": "2" +} diff --git a/third_party/BUILD.bazel b/third_party/BUILD.bazel new file mode 100644 index 00000000..1d491db6 --- /dev/null +++ b/third_party/BUILD.bazel @@ -0,0 +1,2 @@ +# Registry-module patches referenced from MODULE.bazel. +exports_files(glob(["*.patch"])) diff --git a/third_party/boost_container_cc_test_load.patch b/third_party/boost_container_cc_test_load.patch new file mode 100644 index 00000000..050b0939 --- /dev/null +++ b/third_party/boost_container_cc_test_load.patch @@ -0,0 +1,17 @@ +--- a/gen_test_targets.bzl ++++ b/gen_test_targets.bzl +@@ -1,3 +1,5 @@ ++load("@rules_cc//cc:cc_test.bzl", "cc_test") ++ + def gen_test_targets(name, cc_srcs, header_srcs): + """Generates a cc_test target for each source file. + +@@ -9,7 +11,7 @@ + + for src in cc_srcs: + name = src.removeprefix("test/").removesuffix(".cpp").replace("/", "_") +- native.cc_test( ++ cc_test( + name = name, + srcs = [src] + header_srcs, + deps = [