connectrpc / connectrpc/connect-rust
Bazel: Skylark rules for buffa_rust_library and connectrpc_rust_library
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 509
- Forks
- 66
- Avg merge
- 2d 8h
- Merged PRs (30d)
- 10
Description
Background
PR #38 (Add Bazel example for buffa+connectrpc protoc plugins) introduces a working Bazel integration for the codegen pipeline using a hand-rolled genrule. The genrule:
- lists every
.protofile as asrcsentry, - pre-declares each generated
.rsfilename inouts, - inlines the protoc invocation (or generates a
buf.gen.yaml) directly in thecmd, - requires the caller to know the output naming convention used by
protoc-gen-buffa/protoc-gen-buffa-packaging/protoc-gen-connect-rust.
This is fine as a demo but not what teams should be writing for every proto target in a real Bazel codebase. The natural next step is two custom Starlark rules — buffa_rust_library and connectrpc_rust_library — modeled on rules_rust_prosts rust_prost_library.
Proposed shape
load("@rules_buffa//:defs.bzl", "buffa_rust_library")
load("@rules_connectrpc//:defs.bzl", "connectrpc_rust_library")
proto_library(
name = "greet_proto",
srcs = ["greet.proto"],
strip_import_prefix = "/proto",
)
# Rust message types from buffa codegen.
buffa_rust_library(
name = "greet_buffa",
proto = ":greet_proto",
options = {"views": True, "json": True},
)
# Rust service stubs (server traits, client structs) from connectrpc codegen.
connectrpc_rust_library(
name = "greet_connect",
proto = ":greet_proto",
buffa_module = "crate::proto",
deps = [":greet_buffa"], # references buffa-generated message types
)
What the rules would do internally:
- Pull
ProtoInfofrom theproto = ...attribute to get the transitive descriptor set, source files, and import paths. - Resolve plugin binaries via a registered toolchain (
buffa_toolchain/connectrpc_toolchain) — modeled onrust_prost_toolchain. - Run
protoc(or invoke buf) as a Bazel action. - Predict output filenames from
.protofile paths (theproto_path_to_rust_moduleconvention is deterministic —foo/bar/v1.proto→foo.bar.v1.rs) so they can be declared at analysis time. - Compile the generated files into a
rust_libraryand return bothRustAnalyzerInfoandCrateInfoproviders, so downstreamrust_library/rust_testtargets compose naturally.
Open questions
- Do these live in this repo, or would Buf Inc host them in a
rules_buf_rustextension repo (mirroringrules_rust_prostunder bazelbuild/rules_rust)? Splitting into two rules (buffa_rust_libraryfor messages,connectrpc_rust_libraryfor services) lets buffa be used standalone, but means the connectrpc rule has a soft dependency on the buffa rules output. - Toolchain shape: should the buffa toolchain be parameterized over
views/json/text/utf8_validation/etc., or should those stay rule-attribute knobs? - How should we expose the buf-driven path? A
use_buf_generate = Trueattribute that swaps protoc for buf, or a separate rule? PR #38 demonstrates both wrappers in plain genrules — for the Skylark rule wed want to pick one default. - Does this overlap usefully with a hypothetical language-agnostic
buf_generaterule fromrules_buf(separate proposal being drafted for Buf Inc)? Ifbuf_generateexists, the buffa/connectrpc rules might layer on top of it instead of invoking protoc/buf directly.
Out of scope for this issue
A language-agnostic buf_generate rule that would serve as the foundation here is a separate proposal that should land upstream in bufbuild/rules_buf, not in this repo.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing PR #38 and the rules_rust_prost implementation, then map the proposed buffa_rust_library and connectrpc_rust_library interfaces to ProtoInfo, registered toolchains, and Rust providers. Resolve the repository, toolchain, and buf-generation questions before implementation; done means both rules compose with downstream rust_library and rust_test targets.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- build-system, tooling
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100