#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#
load("@rules_proto//proto:defs.bzl", "proto_library")
load("@rules_cc//cc:defs.bzl", "cc_proto_library")
load("@rules_proto_grpc//cpp:defs.bzl", "cpp_grpc_library", "cpp_grpc_compile")

proto_library(
    name = "apache_rocketmq_definition",
    srcs = [
        "apache/rocketmq/v1/definition.proto",
    ],
    deps = [
        "@com_google_protobuf//:empty_proto",
        "@com_google_protobuf//:field_mask_proto",
        "@com_google_protobuf//:duration_proto",
        "@com_google_protobuf//:timestamp_proto",
        "@com_google_googleapis//google/rpc:code_proto",
        "@com_google_googleapis//google/rpc:error_details_proto",
        "@com_google_googleapis//google/rpc:status_proto",
    ],
    strip_import_prefix = "/proto",
)

proto_library(
    name = "apache_rocketmq_admin",
    srcs = [
        "apache/rocketmq/v1/admin.proto",
    ],
    deps = [
        ":apache_rocketmq_definition",
        "@com_google_protobuf//:field_mask_proto",
        "@com_google_protobuf//:empty_proto",
    ],
    strip_import_prefix = "/proto",
)

proto_library(
    name = "apache_rocketmq_service",
    srcs = [
        "apache/rocketmq/v1/service.proto",
    ],
    deps = [
        ":apache_rocketmq_definition",
        "@com_google_protobuf//:any_proto",
        "@com_google_protobuf//:duration_proto",
        "@com_google_protobuf//:timestamp_proto",
        "@com_google_googleapis//google/rpc:code_proto",
        "@com_google_googleapis//google/rpc:error_details_proto",
        "@com_google_googleapis//google/rpc:status_proto",
    ],
    strip_import_prefix = "/proto",
)

cpp_grpc_library(
    name = "rocketmq_grpc_library",
    protos = [
        ":apache_rocketmq_definition",
        ":apache_rocketmq_admin",
        ":apache_rocketmq_service",
        "@com_google_googleapis//google/rpc:code_proto",
        "@com_google_googleapis//google/rpc:error_details_proto",
        "@com_google_googleapis//google/rpc:status_proto",
    ],
    visibility = ["//visibility:public"]
)