#
# 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_cc//cc:defs.bzl", "cc_binary")

cc_binary(
    name = "example_producer",
    srcs = [
        "ExampleProducer.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "example_async_producer",
    srcs = [
        "ExampleAsyncProducer.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "sql_producer",
    srcs = [
        "SqlProducer.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "example_push_consumer",
    srcs = [
        "ExamplePushConsumer.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "push_consumer_with_custom_executor",
    srcs = [
        "PushConsumerWithCustomExecutor.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "push_consumer_with_throttle",
    srcs = [
        "PushConsumerWithThrottle.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "sql_consumer",
    srcs = [
        "SqlConsumer.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "example_pull_consumer",
    srcs = [
        "ExamplePullConsumer.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "benchmark_push_consumer",
    srcs = [
        "BenchmarkPushConsumer.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "example_broadcast_push_consumer",
    srcs = [
        "ExampleBroadcastPushConsumer.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)

cc_binary(
    name = "example_transaction_producer",
    srcs = [
        "ExampleTransactionProducer.cpp",
    ],
    deps = [
        "//src/main/cpp/rocketmq:rocketmq_library",
    ],
)