###############################################################################
# @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_binary",
    "rust_library",
)

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

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

rust_library(
    name = "multipart",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    compile_data = glob(["**"]) + select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
        "buf_redux",
        "httparse",
        "quick-error",
        "safemem",
        "server",
        "twoway",
    ],
    crate_root = "src/lib.rs",
    data = select_with_or({
        "//conditions:default": [
        ],
    }),
    edition = "2015",
    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.18.0",
    deps = [
    ] + select_with_or({
        "//conditions:default": [
            "@rules_rust_wasm_bindgen__buf_redux-0.8.4//:buf_redux",
            "@rules_rust_wasm_bindgen__httparse-1.7.1//:httparse",
            "@rules_rust_wasm_bindgen__log-0.4.17//:log",
            "@rules_rust_wasm_bindgen__mime-0.3.16//:mime",
            "@rules_rust_wasm_bindgen__mime_guess-2.0.4//:mime_guess",
            "@rules_rust_wasm_bindgen__quick-error-1.2.3//:quick_error",
            "@rules_rust_wasm_bindgen__rand-0.8.5//:rand",
            "@rules_rust_wasm_bindgen__safemem-0.3.3//:safemem",
            "@rules_rust_wasm_bindgen__tempfile-3.3.0//:tempfile",
            "@rules_rust_wasm_bindgen__twoway-0.1.8//:twoway",
        ],
    }),
)

rust_binary(
    name = "form_test__bin",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    compile_data = glob(["**"]) + select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
        "buf_redux",
        "httparse",
        "quick-error",
        "safemem",
        "server",
        "twoway",
    ],
    crate_root = "src/bin/form_test.rs",
    data = select_with_or({
        "//conditions:default": [
        ],
    }),
    edition = "2015",
    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.18.0",
    deps = [
        ":multipart",
    ] + select_with_or({
        "//conditions:default": [
            "@rules_rust_wasm_bindgen__buf_redux-0.8.4//:buf_redux",
            "@rules_rust_wasm_bindgen__httparse-1.7.1//:httparse",
            "@rules_rust_wasm_bindgen__log-0.4.17//:log",
            "@rules_rust_wasm_bindgen__mime-0.3.16//:mime",
            "@rules_rust_wasm_bindgen__mime_guess-2.0.4//:mime_guess",
            "@rules_rust_wasm_bindgen__quick-error-1.2.3//:quick_error",
            "@rules_rust_wasm_bindgen__rand-0.8.5//:rand",
            "@rules_rust_wasm_bindgen__safemem-0.3.3//:safemem",
            "@rules_rust_wasm_bindgen__tempfile-3.3.0//:tempfile",
            "@rules_rust_wasm_bindgen__twoway-0.1.8//:twoway",
        ],
    }),
)
