"""Common libraries used in multiple Crubit tools."""

load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
load("@rules_cc//cc:cc_library.bzl", "cc_library")
load(
    "@rules_rust//rust:defs.bzl",
    "rust_library",
    "rust_proc_macro",
    "rust_static_library",
    "rust_test",
)
load("//common/bazel_support:external_binaries.bzl", "EXTERNAL_BINARIES")
load("//common:crubit_wrapper_macros_oss.bzl", "crubit_cc_test", "crubit_rust_test")

package(
    default_applicable_licenses = ["//:license"],
    default_visibility = ["//:__subpackages__"],
)

exports_files([
    "LICENSE_HEADER",
    "golden_test.sh",
])

rust_library(
    name = "arc_anyhow",
    srcs = ["arc_anyhow.rs"],
    deps = [
        "@crate_index//:anyhow",  # v1
    ],
)

cc_library(
    name = "annotation_reader",
    srcs = ["annotation_reader.cc"],
    hdrs = ["annotation_reader.h"],
    deps = [
        ":status_macros",
        ":string_view_conversion",
        "@abseil-cpp//absl/base:core_headers",
        "@abseil-cpp//absl/base:nullability",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings",
        "@abseil-cpp//absl/strings:string_view",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:basic",
        "@llvm-project//llvm:Support",
    ],
)

crubit_cc_test(
    name = "annotation_reader_test",
    srcs = ["annotation_reader_test.cc"],
    deps = [
        ":annotation_reader",
        ":status_test_matchers",
        ":string_view_conversion",
        "//testing/base/public:gunit_main",
        "@abseil-cpp//absl/log:check",
        "@abseil-cpp//absl/strings:string_view",
        "@llvm-project//clang:testing",
    ],
)

crubit_rust_test(
    name = "arc_anyhow_test",
    crate = ":arc_anyhow",
    deps = [
        "@crate_index//:googletest",
    ],
)

rust_library(
    name = "code_gen_utils",
    srcs = ["code_gen_utils.rs"],
    deps = [
        ":arc_anyhow",
        ":crubit_feature",
        "//common:dyn_format",
        "@crate_index//:flagset",  # v0_4
        "@crate_index//:heck",  # v0_5
        "@crate_index//:phf",  # v0_11
        "@crate_index//:proc-macro2",
        "@crate_index//:quote",  # v1
        "@crate_index//:syn",  # v1
        "@crate_index//:unicode-ident",
    ],
)

crubit_rust_test(
    name = "code_gen_utils_test",
    crate = ":code_gen_utils",
    tags = [
        "not_run:arm",  # We don't need to run Crubit itself on aarch64.
        "not_run:mac",
    ],
    deps = [
        ":token_stream_matchers",
        ":token_stream_printer",
        "@crate_index//:googletest",
        "@crate_index//:itertools",  # v0_13
    ],
)

rust_library(
    name = "crubit_feature",
    srcs = ["crubit_feature.rs"],
    deps = [
        "@crate_index//:flagset",  # v0_4
        "@crate_index//:serde",  # v1
    ],
)

rust_library(
    name = "dyn_format",
    srcs = ["dyn_format.rs"],
    deps = [
        "@crate_index//:anyhow",  # v1
    ],
)

rust_test(
    name = "dyn_format_test",
    srcs = ["dyn_format_test.rs"],
    deps = [
        ":dyn_format",
        "@crate_index//:googletest",
    ],
)

crubit_rust_test(
    name = "crubit_feature_test",
    crate = ":crubit_feature",
    deps = [
        "@crate_index//:googletest",
        "@crate_index//:serde_json",  # v1
    ],
)

cc_library(
    name = "file_io",
    srcs = ["file_io.cc"],
    hdrs = ["file_io.h"],
    deps = [
        ":string_view_conversion",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings:string_view",
        "@llvm-project//llvm:Support",
    ],
)

cc_library(
    name = "cc_ffi_types",
    srcs = ["ffi_types.cc"],
    hdrs = ["ffi_types.h"],
    visibility = ["//:__subpackages__"],
    deps = [
        ":ffi_types",  # buildcleaner: keep
        "@abseil-cpp//absl/strings:string_view",
    ],
)

cc_library(
    name = "external_binaries_cc",
    hdrs = ["external_binaries.h"],
    deps = ["@abseil-cpp//absl/strings:string_view"],
)

rust_library(
    name = "external_binaries",
    srcs = ["external_binaries.rs"],
    rustc_env = EXTERNAL_BINARIES,
)

rust_library(
    name = "interner",
    srcs = ["interner.rs"],
    deps = [
        "@crate_index//:bumpalo",  # v3
    ],
)

rust_test(
    name = "interner_test",
    srcs = ["interner_test.rs"],
    deps = [
        ":interner",
        "@crate_index//:bumpalo",  # v3
        "@crate_index//:googletest",
    ],
)

rust_library(
    name = "memoized",
    srcs = ["memoized.rs"],
)

rust_test(
    name = "memoized_test",
    crate = ":memoized",
    deps = [
        "@crate_index//:googletest",
    ],
)

bzl_library(
    name = "multiplatform_testing_bzl",
    srcs = ["multiplatform_testing.bzl"],
    visibility = [
        "//:__subpackages__",
    ],
)

rust_library(
    name = "multiplatform_testing",
    testonly = 1,
    srcs = ["multiplatform_testing.rs"],
    visibility = [
        "//:__subpackages__",
    ],
)

rust_library(
    name = "ffi_types",
    srcs = ["ffi_types.rs"],
    visibility = ["//:__subpackages__"],
)

crubit_rust_test(
    name = "ffi_types_test",
    crate = ":ffi_types",
    deps = [
        "@crate_index//:googletest",
    ],
)

rust_proc_macro(
    name = "item_exists",
    testonly = 1,
    srcs = ["item_exists.rs"],
    visibility = [
        "//:__subpackages__",
    ],
    deps = [
        "@crate_index//:proc-macro2",
        "@crate_index//:quote",  # v1
        "@crate_index//:syn",  # v1
    ],
)

crubit_rust_test(
    name = "item_exists_test",
    srcs = ["item_exists_test.rs"],
    proc_macro_deps = [
        ":item_exists",
    ],
    deps = [
        "@crate_index//:googletest",
    ],
)

cc_library(
    name = "strong_int",
    hdrs = ["strong_int.h"],
    deps = ["@abseil-cpp//absl/hash"],
)

cc_library(
    name = "string_type",
    hdrs = ["string_type.h"],
    deps = [
        "@abseil-cpp//absl/flags:marshalling",
        "@abseil-cpp//absl/strings:string_view",
    ],
)

cc_library(
    name = "status_macros",
    hdrs = ["status_macros.h"],
    deps = [
        "@abseil-cpp//absl/base:core_headers",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:statusor",
    ],
)

rust_library(
    name = "token_stream_matchers",
    testonly = 1,
    srcs = ["token_stream_matchers.rs"],
    visibility = [
        "//:__subpackages__",
    ],
    deps = [
        ":token_stream_matchers_fastpath",
        ":token_stream_printer",
        "@crate_index//:anyhow",  # v1
        "@crate_index//:indenter",  # v0_3
        "@crate_index//:proc-macro2",
    ],
)

crubit_rust_test(
    name = "token_stream_matchers_test",
    timeout = "short",
    crate = ":token_stream_matchers",
    tags = [
        "not_run:arm",  # We don't need to run Crubit itself on aarch64.
        "not_run:mac",
    ],
    deps = [
        "@crate_index//:googletest",
        "@crate_index//:quote",  # v1
    ],
)

rust_library(
    name = "token_stream_matchers_fastpath",
    testonly = 1,
    srcs = ["token_stream_matchers_fastpath.rs"],
    visibility = ["//cargo:__subpackages__"],
    deps = [
        ":token_stream_printer",
        "@crate_index//:anyhow",  # v1
        "@crate_index//:proc-macro2",
    ],
)

rust_library(
    name = "token_stream_printer",
    srcs = ["token_stream_printer.rs"],
    data = [
    ],
    deps = [
        ":external_binaries",
        ":ffi_types",
        "@crate_index//:anyhow",  # v1
        "@crate_index//:proc-macro2",
    ],
)

crubit_rust_test(
    name = "token_stream_printer_test",
    crate = ":token_stream_printer",
    tags = [
        "not_run:arm",  # We don't need to run Crubit itself on aarch64.
        "not_run:mac",
    ],
    deps = [
        "@crate_index//:googletest",
        "@crate_index//:quote",  # v1
        "@crate_index//:tempfile",  # v3
    ],
)

rust_library(
    name = "kythe_metadata",
    srcs = ["kythe_metadata.rs"],
    visibility = [
        "//:__subpackages__",
    ],
    deps = [
        ":token_stream_printer",
        "@crate_index//:anyhow",  # v1
        "@crate_index//:base64",  # v0_22
        "@crate_index//:serde",  # v1
        "@crate_index//:serde_json",  # v1
    ],
)

crubit_rust_test(
    name = "kythe_metadata_test",
    crate = ":kythe_metadata",
    tags = [
        "not_run:arm",  # We don't need to run Crubit itself on aarch64.
        "not_run:mac",
    ],
    deps = [
        "@crate_index//:googletest",
    ],
)

cc_library(
    name = "test_utils",
    testonly = True,
    srcs = ["test_utils.cc"],
    hdrs = ["test_utils.h"],
    deps = [
        ":file_io",
        "@abseil-cpp//absl/log:check",
        "@abseil-cpp//absl/strings",
        "@abseil-cpp//absl/strings:string_view",
        "@googletest//:gtest",
        "@llvm-project//llvm:Support",
    ],
)

cc_library(
    name = "status_test_matchers",
    testonly = True,
    hdrs = ["status_test_matchers.h"],
    deps = [
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:statusor",
        "@googletest//:gtest",
    ],
)

cc_library(
    name = "rust_allocator_shims",
    srcs = ["rust_allocator_shims.c"],
    visibility = ["@rust_linux_x86_64__x86_64-unknown-linux-gnu__nightly_tools//:__subpackages__"],
)

cc_library(
    name = "string_view_conversion",
    hdrs = ["string_view_conversion.h"],
    deps = [
        "@abseil-cpp//absl/strings:string_view",
        "@llvm-project//llvm:Support",
    ],
)

rust_library(
    name = "errors",
    srcs = ["errors.rs"],
    deps = [
        ":arc_anyhow",
        ":error_report",
        "@crate_index//:anyhow",  # v1
    ],
)

crubit_rust_test(
    name = "errors_test",
    srcs = ["errors_test.rs"],
    deps = [
        ":arc_anyhow",
        ":error_report",
        ":errors",
        "@crate_index//:googletest",
        "@crate_index//:serde_json",  # v1
    ],
)

rust_library(
    name = "error_report",
    srcs = ["error_report.rs"],
    visibility = [
        "//:__subpackages__",
    ],
    deps = [
        ":arc_anyhow",
        "@crate_index//:anyhow",  # v1
        "@crate_index//:regex",  # v1
        "@crate_index//:serde",  # v1
        "@crate_index//:serde_json",  # v1
    ],
)

crubit_rust_test(
    name = "error_report_test",
    crate = ":error_report",
    deps = [
        "@crate_index//:googletest",
        "@crate_index//:serde_json",  # v1
    ],
)

rust_library(
    name = "crubit_abi_type",
    srcs = ["crubit_abi_type.rs"],
    visibility = [
        "//:__subpackages__",
        "//cargo:__subpackages__",
    ],
    deps = [
        "@crate_index//:proc-macro2",
        "@crate_index//:quote",  # v1
    ],
)

crubit_rust_test(
    name = "crubit_abi_type_test",
    crate = ":crubit_abi_type",
    deps = [
        "@crate_index//:googletest",
    ],
)

rust_static_library(
    name = "include_allocator_symbols",
    srcs = ["empty.rs"],
)
