# Copyright 2021 The gRPC Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Generates and compiles C++ grpc stubs from proto_library rules."""

load(":generate_cc.bzl", "generate_cc")

# Simplified version of gRPC upstream's cc_grpc_library.
def cc_grpc_library(
        name,
        srcs,
        deps,
        generate_mocks = False,
        extra_cc_library_kwargs = {},
        **kwargs):
    """Generates C++ grpc classes for services defined in proto_library rules.

    This rule expects a singleton list containing a proto_library target for its
    srcs argument, and expects a list (of arbitrary size) of cc_proto_library
    targets for its deps argument.

    It generates only grpc library classes.

    Assumes the generated classes will be used in cc_api_version = 2.

    Args:
        name (str): Name of rule.
        srcs (list): A single proto_library which contains services descriptors.
        deps (list): A list of cc_proto_library targets which
          provide the compiled code of any message that the services depend on.
        generate_mocks (bool): when True, Google Mock code for client stub is
          generated. False by default.
        extra_cc_library_kwargs (map): extra arguments to pass to the cc_library
          rule
        **kwargs: extra arguments to pass to all rules instantiated by this
          macro. Must be common to all build rules. See
          https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes
    """
    if len(srcs) != 1:
        fail("The srcs attribute must be a singleton list but was " + str(srcs),
             "srcs")

    codegen_grpc_target = "_" + name + "_grpc_codegen"
    generate_cc(
        name = codegen_grpc_target,
        srcs = srcs,
        plugin = "//third_party/grpc:cpp_plugin",
        generate_mocks = generate_mocks,
        protoc = "//third_party/protobuf:protoc",
        **kwargs
    )

    cc_library_kwargs = dict(**extra_cc_library_kwargs)
    cc_library_kwargs.update(**kwargs)
    native.cc_library(
        name = name,
        srcs = [":" + codegen_grpc_target],
        hdrs = [":" + codegen_grpc_target],
        deps = deps + ["//third_party/grpc:grpc++_codegen_proto"],
        **cc_library_kwargs
    )
