1"""A custom rule that threats all its dependencies as direct dependencies."""
2
3# buildifier: disable=bzl-visibility
4load("//rust/private:providers.bzl", "BuildInfo", "CrateInfo", "DepInfo", "DepVariantInfo")
5
6# buildifier: disable=bzl-visibility
7load("//rust/private:rustc.bzl", "rustc_compile_action")
8
9def _with_modified_crate_name_impl(ctx):
10    toolchain = ctx.toolchains[Label("//rust:toolchain_type")]
11
12    crate_root = ctx.attr.src.files.to_list()[0]
13    output_hash = repr(hash(crate_root.path))
14    crate_name = ctx.label.name + "_my_custom_crate_suffix"
15    crate_type = "rlib"
16
17    rust_lib_name = "{prefix}{name}-{lib_hash}{extension}".format(
18        prefix = "lib",
19        name = crate_name,
20        lib_hash = output_hash,
21        extension = ".rlib",
22    )
23
24    deps = [DepVariantInfo(
25        crate_info = dep[CrateInfo] if CrateInfo in dep else None,
26        dep_info = dep[DepInfo] if DepInfo in dep else None,
27        build_info = dep[BuildInfo] if BuildInfo in dep else None,
28        cc_info = dep[CcInfo] if CcInfo in dep else None,
29    ) for dep in ctx.attr.deps]
30
31    rust_lib = ctx.actions.declare_file(rust_lib_name)
32    return rustc_compile_action(
33        ctx = ctx,
34        attr = ctx.attr,
35        toolchain = toolchain,
36        crate_info_dict = dict(
37            name = crate_name,
38            type = crate_type,
39            root = crate_root,
40            srcs = ctx.attr.src.files,
41            deps = depset(deps),
42            proc_macro_deps = depset([]),
43            aliases = {},
44            output = rust_lib,
45            owner = ctx.label,
46            edition = "2018",
47            compile_data = depset([]),
48            compile_data_targets = depset([]),
49            rustc_env = {},
50            is_test = False,
51        ),
52        output_hash = output_hash,
53    )
54
55with_modified_crate_name = rule(
56    implementation = _with_modified_crate_name_impl,
57    attrs = {
58        "deps": attr.label_list(),
59        "src": attr.label(
60            allow_single_file = [".rs"],
61        ),
62        "_cc_toolchain": attr.label(
63            default = Label("@bazel_tools//tools/cpp:current_cc_toolchain"),
64        ),
65        "_error_format": attr.label(
66            default = Label("//:error_format"),
67        ),
68        "_process_wrapper": attr.label(
69            default = Label("//util/process_wrapper"),
70            executable = True,
71            allow_single_file = True,
72            cfg = "exec",
73        ),
74    },
75    toolchains = [
76        "@rules_rust//rust:toolchain_type",
77        "@bazel_tools//tools/cpp:toolchain_type",
78    ],
79    fragments = ["cpp"],
80)
81