"""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_<kernel>_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)
