# Copyright 2021 The Pigweed 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
#
#     https://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("@build_bazel_rules_nodejs//:index.bzl", "js_library")
load("@npm//@bazel/typescript:index.bzl", "ts_library", "ts_project")
load("@npm//@bazel/jasmine:index.bzl", "jasmine_node_test")
load("@rules_proto_grpc//js:defs.bzl", "js_proto_library")

package(default_visibility = ["//visibility:public"])

ts_project(
    name = "lib",
    srcs = [
        "call.ts",
        "client.ts",
        "descriptors.ts",
        "hash.ts",
        "index.ts",
        "method.ts",
        "packets.ts",
        "rpc_classes.ts",
    ],
    declaration = True,
    source_map = True,
    deps = [
        "//pw_protobuf_compiler/ts:pw_protobuf_compiler",
        "//pw_rpc:packet_proto_tspb",
        "//pw_status/ts:pw_status",
        "@npm//@types/google-protobuf",
        "@npm//wait-queue",
    ],
)

js_library(
    name = "pw_rpc",
    package_name = "@pigweed/pw_rpc",
    srcs = ["package.json"],
    deps = [":lib"],
)

ts_library(
    name = "rpc_test_lib",
    srcs = [
        "call_test.ts",
        "client_test.ts",
        "descriptors_test.ts",
        "packets_test.ts",
    ],
    data = [
        ":test_protos",
    ],
    deps = [
        ":lib",
        ":test_protos_tspb",
        "//pw_protobuf_compiler/ts:pw_protobuf_compiler",
        "//pw_rpc:packet_proto_tspb",
        "//pw_status/ts:pw_status",
        "@npm//@types/google-protobuf",
        "@npm//@types/jasmine",
        "@npm//@types/node",
    ],
)

jasmine_node_test(
    name = "rpc_test",
    srcs = [
        ":rpc_test_lib",
    ],
)

proto_library(
    name = "test_protos",
    srcs = [
        "test.proto",
        "test2.proto",
    ],
)

js_proto_library(
    name = "test_protos_tspb",
    protos = [":test_protos"],
)
