# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

# THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY!!!
# See //README.md for information on updating

def make_crate_aliases():
  native.alias (
    name = "cortex-m",
    target_compatible_with = select({
      ":no_std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":no_std": "//crates/vendor:cortex-m",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "cortex-m-rt",
    target_compatible_with = select({
      ":no_std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":no_std": "//crates/vendor:cortex-m-rt",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "cortex-m-semihosting",
    target_compatible_with = select({
      ":no_std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":no_std": "//crates/vendor:cortex-m-semihosting",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "critical-section",
    target_compatible_with = select({
      ":no_std": [],
      ":std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":no_std": "//crates/vendor:critical-section",
      ":std": "//crates_std/vendor:critical-section",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "embassy-sync",
    target_compatible_with = select({
      ":no_std": [],
      ":std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":no_std": "//crates/vendor:embassy-sync",
      ":std": "//crates_std/vendor:embassy-sync",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "futures-test",
    target_compatible_with = select({
      ":no_std": [],
      ":std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":no_std": "//crates/vendor:futures-test",
      ":std": "//crates_std/vendor:futures-test",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "nom",
    target_compatible_with = select({
      ":std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":std": "//crates_std/vendor:nom",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "panic-halt",
    target_compatible_with = select({
      ":no_std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":no_std": "//crates/vendor:panic-halt",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "paste",
    target_compatible_with = select({
      ":std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":std": "//crates_std/vendor:paste",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "proc-macro2",
    target_compatible_with = select({
      ":std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":std": "//crates_std/vendor:proc-macro2",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "quote",
    target_compatible_with = select({
      ":std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":std": "//crates_std/vendor:quote",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "static_cell",
    target_compatible_with = select({
      ":no_std": [],
      ":std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":no_std": "//crates/vendor:static_cell",
      ":std": "//crates_std/vendor:static_cell",
    }),
    visibility = ["//visibility:public"],
  )

  native.alias (
    name = "syn",
    target_compatible_with = select({
      ":std": [],
      "//conditions:default": ["@platforms//:incompatible"],
    }),
    actual = select({
      ":std": "//crates_std/vendor:syn",
    }),
    visibility = ["//visibility:public"],
  )

