###############################################################################
# @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 OR Apache-2.0
# ])

rust_library(
    name = "windows_sys",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    compile_data = glob(
        include = ["**"],
        exclude = [
            "BUILD",
            "BUILD.bazel",
            "WORKSPACE",
            "WORKSPACE.bazel",
        ],
    ) + select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
        "Win32",
        "Win32_Foundation",
        "Win32_Networking",
        "Win32_Networking_WinSock",
        "Win32_Security",
        "Win32_Storage",
        "Win32_Storage_FileSystem",
        "Win32_System",
        "Win32_System_IO",
        "Win32_System_LibraryLoader",
        "Win32_System_Pipes",
        "Win32_System_SystemServices",
        "Win32_System_WindowsProgramming",
        "default",
    ],
    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.36.1",
    deps = [
    ] + select_with_or({
        # aarch64-pc-windows-msvc
        #
        # No supported platform triples for cfg: 'aarch64-pc-windows-msvc'
        # Skipped dependencies: [{"id":"windows_aarch64_msvc 0.36.1","target":"windows_aarch64_msvc"}]
        #
        # aarch64-uwp-windows-msvc
        #
        # No supported platform triples for cfg: 'aarch64-uwp-windows-msvc'
        # Skipped dependencies: [{"id":"windows_aarch64_msvc 0.36.1","target":"windows_aarch64_msvc"}]
        #
        # i686-pc-windows-gnu
        #
        # No supported platform triples for cfg: 'i686-pc-windows-gnu'
        # Skipped dependencies: [{"id":"windows_i686_gnu 0.36.1","target":"windows_i686_gnu"}]
        #
        # i686-pc-windows-msvc
        (
            "@rules_rust//rust/platform:i686-pc-windows-msvc",
        ): [
            # Target Deps
            "@crates_vendor_manifests__windows_i686_msvc-0.36.1//:windows_i686_msvc",

            # Common Deps
        ],
        # i686-uwp-windows-gnu
        #
        # No supported platform triples for cfg: 'i686-uwp-windows-gnu'
        # Skipped dependencies: [{"id":"windows_i686_gnu 0.36.1","target":"windows_i686_gnu"}]
        #
        # i686-uwp-windows-msvc
        #
        # No supported platform triples for cfg: 'i686-uwp-windows-msvc'
        # Skipped dependencies: [{"id":"windows_i686_msvc 0.36.1","target":"windows_i686_msvc"}]
        #
        # x86_64-pc-windows-gnu
        #
        # No supported platform triples for cfg: 'x86_64-pc-windows-gnu'
        # Skipped dependencies: [{"id":"windows_x86_64_gnu 0.36.1","target":"windows_x86_64_gnu"}]
        #
        # x86_64-pc-windows-msvc
        (
            "@rules_rust//rust/platform:x86_64-pc-windows-msvc",
        ): [
            # Target Deps
            "@crates_vendor_manifests__windows_x86_64_msvc-0.36.1//:windows_x86_64_msvc",

            # Common Deps
        ],
        # x86_64-uwp-windows-gnu
        #
        # No supported platform triples for cfg: 'x86_64-uwp-windows-gnu'
        # Skipped dependencies: [{"id":"windows_x86_64_gnu 0.36.1","target":"windows_x86_64_gnu"}]
        #
        # x86_64-uwp-windows-msvc
        #
        # No supported platform triples for cfg: 'x86_64-uwp-windows-msvc'
        # Skipped dependencies: [{"id":"windows_x86_64_msvc 0.36.1","target":"windows_x86_64_msvc"}]
        #
        "//conditions:default": [
        ],
    }),
)
