-
Notifications
You must be signed in to change notification settings - Fork 15
Bazel: Skylark rules for buffa_rust_library and connectrpc_rust_library #39
Copy link
Copy link
Open
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 Add Bazel example for buffa+connectrpc protoc plugins #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.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Type
Fields
Give feedbackNo fields configured for issues without a type.