Skip to content

Allow renaming generated Prost crate name #3438

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion extensions/prost/private/prost.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -278,10 +278,18 @@ def _rust_prost_aspect_impl(target, ctx):
transform_infos.append(data_target[ProstTransformInfo])

rust_deps = runtime_deps + direct_deps
crate_name_overrides = []
for transform_info in transform_infos:
rust_deps.extend(transform_info.deps)
if transform_info.crate_name:
crate_name_overrides.append(transform_info.crate_name)

crate_name = ctx.label.name.replace("-", "_").replace("/", "_")
if len(crate_name_overrides) > 1:
fail("Multiple crate name overrides detected. Only one override is allowed. Please check your rust_prost_transform targets.")
elif len(crate_name_overrides) == 1:
crate_name = crate_name_overrides[0]
else:
crate_name = ctx.label.name.replace("-", "_").replace("/", "_")

proto_info = target[ProtoInfo]

Expand Down
6 changes: 6 additions & 0 deletions extensions/prost/private/prost_transform.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ load("@rules_rust//rust:defs.bzl", "rust_common")
ProstTransformInfo = provider(
doc = "Info about transformations to apply to Prost generated source code.",
fields = {
"crate_name": "str: The name of crate generated by Prost.",
"deps": "List[DepVariantInfo]: Additional dependencies to compile into the Prost target.",
"prost_opts": "List[str]: Additional prost flags.",
"srcs": "Depset[File]: Additional source files to include in generated Prost source code.",
Expand All @@ -27,6 +28,7 @@ def _rust_prost_transform_impl(ctx):
# consumers of the `proto_library` target this rule is expected to be passed
# to.
return [ProstTransformInfo(
crate_name = ctx.attr.crate_name if ctx.attr.crate_name else None,
deps = deps,
prost_opts = ctx.attr.prost_opts,
srcs = depset(ctx.files.srcs),
Expand Down Expand Up @@ -71,6 +73,10 @@ actions with minimal impact to other consumers.
""",
implementation = _rust_prost_transform_impl,
attrs = {
"crate_name": attr.string(
doc = "The name of the crate generated by Prost. This is used to override the default name which is the name of the proto_library target.",
mandatory = False,
),
"deps": attr.label_list(
doc = "Additional dependencies to add to the compiled crate.",
providers = [[rust_common.crate_info], [rust_common.crate_group_info]],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
load("@rules_proto//proto:defs.bzl", "proto_library")
load("//:defs.bzl", "rust_prost_library", "rust_prost_transform")

package(default_visibility = ["//private/tests:__subpackages__"])

proto_library(
name = "models",
srcs = [
"models.proto",
],
data = [
":models_transform",
],
strip_import_prefix = "/private/tests/same_proto_name",
deps = [
"//private/tests/same_proto_name/package2:models",
"//private/tests/same_proto_name/package3:models",
],
)

rust_prost_transform(
name = "models_transform",
crate_name = "package1_models",
)

rust_prost_library(
name = "models_rs_proto",
proto = ":models",
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
syntax = "proto3";

package package1;
import "package2/models.proto";
import "package3/models.proto";

message Model {
package2.Model model = 1;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
load("@rules_proto//proto:defs.bzl", "proto_library")
load("//:defs.bzl", "rust_prost_library", "rust_prost_transform")

package(default_visibility = ["//private/tests:__subpackages__"])

proto_library(
name = "models",
srcs = [
"models.proto",
],
data = [
":models_transform",
],
strip_import_prefix = "/private/tests/same_proto_name",
deps = [
"//private/tests/same_proto_name/package3:models",
],
)

rust_prost_transform(
name = "models_transform",
crate_name = "package2_models",
)

rust_prost_library(
name = "models_rs_proto",
proto = ":models",
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
syntax = "proto3";

package package2;
import "package3/models.proto";

message Model {
package3.Model model = 1;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
load("@rules_proto//proto:defs.bzl", "proto_library")
load("//:defs.bzl", "rust_prost_library", "rust_prost_transform")

package(default_visibility = ["//private/tests:__subpackages__"])

proto_library(
name = "models",
srcs = [
"models.proto",
],
data = [
":models_transform",
],
strip_import_prefix = "/private/tests/same_proto_name",
)

rust_prost_transform(
name = "models_transform",
crate_name = "package3_models",
)

rust_prost_library(
name = "models_rs_proto",
proto = ":models",
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
syntax = "proto3";

package package3;

message Model {
string stuff = 1;
}