"""Support libraries that the generated Rust/C++ bindings depend upon."""

load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_cc//cc:cc_test.bzl", "cc_test")
load("@rules_rust//rust:defs.bzl", "rust_library", "rust_proc_macro", "rust_test")
load("//common:crubit_wrapper_macros_oss.bzl", "crubit_rust_test")

package(default_applicable_licenses = ["//:license"])

exports_files(
    srcs = glob(["*"]),
    visibility = [
        ":__subpackages__",
    ],
)

rust_library(
    name = "cpp_std",
    srcs = ["cpp_std.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    edition = "2024",
    visibility = [
        "//visibility:public",
    ],
    deps = [
        "//support/cc_std",
    ],
)

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

rust_library(
    name = "cref",
    srcs = ["cref.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    edition = "2024",
    visibility = [
        "//visibility:public",
    ],
)

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

rust_library(
    name = "ctor",
    srcs = ["ctor.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    crate_features = ["same_abi"],
    edition = "2024",
    proc_macro_deps = [":ctor_proc_macros"],
    visibility = [
        "//visibility:public",
    ],
)

rust_proc_macro(
    name = "ctor_proc_macros",
    srcs = ["ctor_proc_macros.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    deps = [
        "@crate_index//:proc-macro2",
        "@crate_index//:quote",  # v1
        "@crate_index//:syn",  # v2
    ],
)

cc_library(
    name = "annotations",
    hdrs = ["annotations.h"],
    compatible_with = ["//buildenv/target:non_prod"],
    visibility = [
        "//visibility:public",
    ],
    deps = [
        ":annotations_internal",
    ],
)

cc_library(
    name = "annotations_internal",
    hdrs = ["annotations_internal.h"],
    compatible_with = ["//buildenv/target:non_prod"],
    visibility = [
        "//visibility:public",
    ],
    deps = [],
)

cc_library(
    name = "lifetime_annotations",
    hdrs = ["lifetime_annotations.h"],
    compatible_with = ["//buildenv/target:non_prod"],
    visibility = [
        "//visibility:public",
    ],
)

rust_proc_macro(
    name = "crubit_annotate",
    srcs = ["crubit_annotate/src/crubit_annotate.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    visibility = [
        "//visibility:public",
    ],
    deps = [
        "@crate_index//:proc-macro2",
        "@crate_index//:quote",  # v1
        "@crate_index//:syn",  # v2
    ],
)

rust_test(
    name = "crubit_annotate_test",
    srcs = ["crubit_annotate_test.rs"],
    proc_macro_deps = [
        ":crubit_annotate",
    ],
)

crubit_rust_test(
    name = "ctor_proc_macros_test",
    crate = ":ctor_proc_macros_proc_macro_internal",
    deps = [
        "//common:token_stream_matchers",
        "@crate_index//:googletest",
        "@crate_index//:static_assertions",  # v1
    ],
)

crubit_rust_test(
    name = "ctor_rename_test",
    srcs = ["ctor_rename_test.rs"],
    # Despite the name "aliases", the name `ctor` is actually not available in the test body.
    # This is important for the purpose of the test.
    aliases = {
        "ctor": "renamed_ctor",
    },
    deps = [
        ":ctor",
        "@crate_index//:googletest",
    ],
)

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

rust_test(
    name = "ctor_proc_macros_e2e_test",
    srcs = ["ctor_proc_macros_e2e_test.rs"],
    deps = [
        ":ctor",
        "@crate_index//:googletest",
        "@crate_index//:static_assertions",  # v1
    ],
)

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

rust_library(
    name = "decltype_cast",
    srcs = ["decltype_cast.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    edition = "2024",
    visibility = [
        "//visibility:public",
    ],
)

rust_library(
    name = "forward_declare",
    srcs = ["forward_declare.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    crate_features = ["unstable"],
    edition = "2024",
    proc_macro_deps = [":forward_declare_proc_macros"],
    visibility = [
        "//visibility:public",
    ],
    deps = [
        ":cref",
    ],
)

rust_proc_macro(
    name = "forward_declare_proc_macros",
    srcs = ["forward_declare_proc_macros.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    visibility = [
        ":__subpackages__",
    ],
    deps = [
        "@crate_index//:proc-macro2",
        "@crate_index//:quote",  # v1
        "@crate_index//:syn",  # v2
    ],
)

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

rust_test(
    name = "forward_declare_unstable_test",
    srcs = ["forward_declare_unstable_test.rs"],
    deps = [
        ":forward_declare",
    ],
)

rust_library(
    name = "oops",
    srcs = ["oops.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    edition = "2024",
    visibility = [
        "//visibility:public",
    ],
)

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

rust_library(
    name = "operator",
    srcs = ["operator.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    edition = "2024",
    visibility = [
        "//visibility:public",
    ],
)

rust_library(
    name = "bridge_rust",
    srcs = ["crubit_bridge_rust/src/bridge.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    edition = "2024",
    visibility = [
        "//visibility:public",
    ],
    deps = [
        ":crubit_support",
    ],
)

rust_test(
    name = "bridge_rust_test",
    srcs = ["crubit_bridge_rust/src/bridge.rs"],
    deps = [
        ":crubit_support",
        "@crate_index//:googletest",
    ],
)

rust_library(
    name = "hash_rust",
    srcs = ["crubit_hash_rust/src/hash.rs"],
    compatible_with = ["//buildenv/target:non_prod"],
    edition = "2024",
    visibility = [
        "//visibility:public",
    ],
    deps = [
        ":crubit_support",
    ],
)

rust_test(
    name = "hash_rust_test",
    srcs = ["crubit_hash_rust/src/hash.rs"],
    deps = [
        ":crubit_support",
        "@crate_index//:googletest",
    ],
)

rust_library(
    name = "crubit_support",
    srcs = [
        "crubit_support/src/bridge.rs",
        "crubit_support/src/dyn_erased_future.rs",
        "crubit_support/src/erased_future.rs",
        "crubit_support/src/hash.rs",
        "crubit_support/src/lib.rs",
    ],
    compatible_with = ["//buildenv/target:non_prod"],
    edition = "2024",
    link_deps = [
        "//support/rs_std:waker",
    ],
    visibility = [
        "//visibility:public",
    ],
)

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

cc_library(
    name = "bridge_cpp",
    hdrs = ["bridge.h"],
    compatible_with = ["//buildenv/target:non_prod"],
    visibility = [
        "//visibility:public",
    ],
)

cc_test(
    name = "bridge_cpp_test",
    srcs = ["bridge_test.cc"],
    deps = [
        ":bridge_cpp",
        "//testing/base/public:gunit_main",
    ],
)

cc_library(
    name = "movable",
    hdrs = ["movable.h"],
    compatible_with = ["//buildenv/target:non_prod"],
    visibility = [
        "//visibility:public",
    ],
    deps = [
        "//support/internal:bindings_support",
    ],
)

cc_test(
    name = "movable_test",
    srcs = ["movable_test.cc"],
    deps = [
        ":movable",
        "//support/internal:bindings_support",
        "//testing/base/public:gunit_main",
    ],
)

# Used to fix SWIG syntax errors when you see Crubit annotations.
filegroup(
    name = "annotations_swig",
    srcs = ["annotations.swig"],
    visibility = [
        "//visibility:public",
    ],
)
