###############################################################################
# @generated
# This file is auto-generated by the cargo-bazel tool.
#
# DO NOT MODIFY: Local changes may be replaced in future executions.
###############################################################################

load(
    "@bazel_skylib//lib:selects.bzl",
    "selects",
)

# buildifier: disable=bzl-visibility
load("@rules_rust//crate_universe/private:selects.bzl", "select_with_or")
load(
    "@rules_rust//rust:defs.bzl",
    "rust_library",
)

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

# licenses([
#     "TODO",  # MIT/Apache-2.0
# ])

rust_library(
    name = "wasm_bindgen_cli_support",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    compile_data = glob(["**"]) + select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
    ],
    crate_root = "src/lib.rs",
    data = select_with_or({
        "//conditions:default": [
        ],
    }),
    edition = "2018",
    proc_macro_deps = [
    ] + select_with_or({
        "//conditions:default": [
        ],
    }),
    rustc_env = {
    },
    rustc_env_files = select_with_or({
        "//conditions:default": [
        ],
    }),
    rustc_flags = [
        # In most cases, warnings in 3rd party crates are not interesting as
        # they're out of the control of consumers. The flag here silences
        # warnings. For more details see:
        # https://doc.rust-lang.org/rustc/lints/levels.html
        "--cap-lints=allow",
    ],
    tags = [
        "cargo-bazel",
        "manual",
        "noclippy",
        "norustfmt",
    ],
    version = "0.2.78",
    deps = [
    ] + select_with_or({
        "//conditions:default": [
            "@rules_rust_wasm_bindgen__anyhow-1.0.58//:anyhow",
            "@rules_rust_wasm_bindgen__base64-0.9.3//:base64",
            "@rules_rust_wasm_bindgen__log-0.4.17//:log",
            "@rules_rust_wasm_bindgen__rustc-demangle-0.1.21//:rustc_demangle",
            "@rules_rust_wasm_bindgen__serde_json-1.0.82//:serde_json",
            "@rules_rust_wasm_bindgen__tempfile-3.3.0//:tempfile",
            "@rules_rust_wasm_bindgen__walrus-0.19.0//:walrus",
            "@rules_rust_wasm_bindgen__wasm-bindgen-externref-xform-0.2.78//:wasm_bindgen_externref_xform",
            "@rules_rust_wasm_bindgen__wasm-bindgen-multi-value-xform-0.2.78//:wasm_bindgen_multi_value_xform",
            "@rules_rust_wasm_bindgen__wasm-bindgen-shared-0.2.78//:wasm_bindgen_shared",
            "@rules_rust_wasm_bindgen__wasm-bindgen-threads-xform-0.2.78//:wasm_bindgen_threads_xform",
            "@rules_rust_wasm_bindgen__wasm-bindgen-wasm-conventions-0.2.78//:wasm_bindgen_wasm_conventions",
            "@rules_rust_wasm_bindgen__wasm-bindgen-wasm-interpreter-0.2.78//:wasm_bindgen_wasm_interpreter",
            "@rules_rust_wasm_bindgen__wit-text-0.8.0//:wit_text",
            "@rules_rust_wasm_bindgen__wit-validator-0.2.1//:wit_validator",
            "@rules_rust_wasm_bindgen__wit-walrus-0.6.0//:wit_walrus",
        ],
    }),
)
