Skip to content

Commit 52d3fd8

Browse files
authored
Allow renaming generated Prost crate name (#3438)
## What? Adds `crate_name` to `rust_prost_transform` which allows overriding the generated crate name ## Why? This allows the end user to control the name of the generated crates to avoid conflicts. Closes Prost Crate Naming Conventions #2889
1 parent e211f2e commit 52d3fd8

File tree

8 files changed

+121
-1
lines changed

8 files changed

+121
-1
lines changed

extensions/prost/private/prost.bzl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,10 +278,18 @@ def _rust_prost_aspect_impl(target, ctx):
278278
transform_infos.append(data_target[ProstTransformInfo])
279279

280280
rust_deps = runtime_deps + direct_deps
281+
crate_name_overrides = []
281282
for transform_info in transform_infos:
282283
rust_deps.extend(transform_info.deps)
284+
if transform_info.crate_name:
285+
crate_name_overrides.append(transform_info.crate_name)
283286

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

286294
proto_info = target[ProtoInfo]
287295

extensions/prost/private/prost_transform.bzl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ load("@rules_rust//rust:defs.bzl", "rust_common")
66
ProstTransformInfo = provider(
77
doc = "Info about transformations to apply to Prost generated source code.",
88
fields = {
9+
"crate_name": "str: The name of crate generated by Prost.",
910
"deps": "List[DepVariantInfo]: Additional dependencies to compile into the Prost target.",
1011
"prost_opts": "List[str]: Additional prost flags.",
1112
"srcs": "Depset[File]: Additional source files to include in generated Prost source code.",
@@ -27,6 +28,7 @@ def _rust_prost_transform_impl(ctx):
2728
# consumers of the `proto_library` target this rule is expected to be passed
2829
# to.
2930
return [ProstTransformInfo(
31+
crate_name = ctx.attr.crate_name if ctx.attr.crate_name else None,
3032
deps = deps,
3133
prost_opts = ctx.attr.prost_opts,
3234
srcs = depset(ctx.files.srcs),
@@ -71,6 +73,10 @@ actions with minimal impact to other consumers.
7173
""",
7274
implementation = _rust_prost_transform_impl,
7375
attrs = {
76+
"crate_name": attr.string(
77+
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.",
78+
mandatory = False,
79+
),
7480
"deps": attr.label_list(
7581
doc = "Additional dependencies to add to the compiled crate.",
7682
providers = [[rust_common.crate_info], [rust_common.crate_group_info]],
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
load("@rules_proto//proto:defs.bzl", "proto_library")
2+
load("//:defs.bzl", "rust_prost_library", "rust_prost_transform")
3+
4+
package(default_visibility = ["//private/tests:__subpackages__"])
5+
6+
proto_library(
7+
name = "models",
8+
srcs = [
9+
"models.proto",
10+
],
11+
data = [
12+
":models_transform",
13+
],
14+
strip_import_prefix = "/private/tests/same_proto_name",
15+
deps = [
16+
"//private/tests/same_proto_name/package2:models",
17+
"//private/tests/same_proto_name/package3:models",
18+
],
19+
)
20+
21+
rust_prost_transform(
22+
name = "models_transform",
23+
crate_name = "package1_models",
24+
)
25+
26+
rust_prost_library(
27+
name = "models_rs_proto",
28+
proto = ":models",
29+
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
syntax = "proto3";
2+
3+
package package1;
4+
import "package2/models.proto";
5+
import "package3/models.proto";
6+
7+
message Model {
8+
package2.Model model = 1;
9+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
load("@rules_proto//proto:defs.bzl", "proto_library")
2+
load("//:defs.bzl", "rust_prost_library", "rust_prost_transform")
3+
4+
package(default_visibility = ["//private/tests:__subpackages__"])
5+
6+
proto_library(
7+
name = "models",
8+
srcs = [
9+
"models.proto",
10+
],
11+
data = [
12+
":models_transform",
13+
],
14+
strip_import_prefix = "/private/tests/same_proto_name",
15+
deps = [
16+
"//private/tests/same_proto_name/package3:models",
17+
],
18+
)
19+
20+
rust_prost_transform(
21+
name = "models_transform",
22+
crate_name = "package2_models",
23+
)
24+
25+
rust_prost_library(
26+
name = "models_rs_proto",
27+
proto = ":models",
28+
)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
syntax = "proto3";
2+
3+
package package2;
4+
import "package3/models.proto";
5+
6+
message Model {
7+
package3.Model model = 1;
8+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
load("@rules_proto//proto:defs.bzl", "proto_library")
2+
load("//:defs.bzl", "rust_prost_library", "rust_prost_transform")
3+
4+
package(default_visibility = ["//private/tests:__subpackages__"])
5+
6+
proto_library(
7+
name = "models",
8+
srcs = [
9+
"models.proto",
10+
],
11+
data = [
12+
":models_transform",
13+
],
14+
strip_import_prefix = "/private/tests/same_proto_name",
15+
)
16+
17+
rust_prost_transform(
18+
name = "models_transform",
19+
crate_name = "package3_models",
20+
)
21+
22+
rust_prost_library(
23+
name = "models_rs_proto",
24+
proto = ":models",
25+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
syntax = "proto3";
2+
3+
package package3;
4+
5+
message Model {
6+
string stuff = 1;
7+
}

0 commit comments

Comments
 (0)