"""This file implements an experimental, do-not-use-kind of rust_proto_library. Disclaimer: This project is experimental, under heavy development, and should not be used yet.""" load("@rules_cc//cc:defs.bzl", "cc_proto_library") load( "//rust:aspects.bzl", "RustProtoInfo", "rust_cc_proto_library_aspect", "rust_upb_proto_library_aspect", ) visibility([ "//experimental/...", "//src/google/protobuf/...", "//rust/...", ]) def rust_proto_library(name, deps, visibility = [], **args): """Declares all the boilerplate needed to use Rust protobufs conveniently. Hopefully no user will ever need to read this code. Args: name: name of the Rust protobuf target. deps: proto_library target for which to generate Rust gencode. **args: other args passed to the rust__proto_library targets. """ if not name.endswith("_rust_proto"): fail("Name of each rust_proto_library target should end with `_rust_proto`") native.alias( name = name, actual = select({ "//rust:use_upb_kernel": name + "_upb_kernel", "//conditions:default": name + "_cpp_kernel", }), visibility = visibility, ) rust_upb_proto_library( name = name + "_upb_kernel", deps = deps, visibility = ["//visibility:private"], **args ) # TODO: Stop declaring cc_proto_library once we can use cc_proto_aspect directly. _cc_proto_name = name.removesuffix("_rust_proto") + "_cc_proto" if not native.existing_rule(_cc_proto_name): cc_proto_library( name = _cc_proto_name, deps = deps, visibility = ["//visibility:private"], **args ) rust_cc_proto_library( name = name + "_cpp_kernel", deps = [_cc_proto_name], visibility = ["//visibility:private"], **args ) def _rust_proto_library_impl(ctx): deps = ctx.attr.deps if not deps: fail("Exactly 1 dependency in `deps` attribute expected, none were provided.") if len(deps) > 1: fail("Exactly 1 dependency in `deps` attribute expected, too many were provided.") dep = deps[0] rust_proto_info = dep[RustProtoInfo] dep_variant_info = rust_proto_info.dep_variant_info return [dep_variant_info.crate_info, dep_variant_info.dep_info, dep_variant_info.cc_info] def _make_rust_proto_library(is_upb): return rule( implementation = _rust_proto_library_impl, attrs = { "deps": attr.label_list( mandatory = True, providers = [ProtoInfo] if is_upb else [CcInfo], aspects = [rust_upb_proto_library_aspect if is_upb else rust_cc_proto_library_aspect], ), }, ) rust_upb_proto_library = _make_rust_proto_library(is_upb = True) rust_cc_proto_library = _make_rust_proto_library(is_upb = False)