# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/banjo/toolchain.gni")
import("//build/compiled_action.gni")
import("//build/rust/rustc_library.gni")
import("//build/rust/toolchain.gni")

# Declares the rustc_library invocation for the generated FIDL bindings.

template("banjo_rust_library") {
  not_needed(invoker, [ "sources" ])

  rustc_target_name = "${target_name}-rustc"
  generation_target_name = "${target_name}_rust_compile"

  library_name = target_name
  if (defined(invoker.name)) {
    library_name = invoker.name
  }

  underscore_name = "banjo_" + string_replace(library_name, ".", "_")

  banjo_target_gen_dir =
      get_label_info(":bogus($banjo_toolchain)", "target_gen_dir")
  file_stem = "$banjo_target_gen_dir/${underscore_name}"

  rustc_library(rustc_target_name) {
    name = underscore_name
    version = "0.1.0"
    edition = "2018"
    forward_variables_from(invoker, [ "testonly" ])
    deps = [
      "//src/lib/fuchsia-async",
      "//src/lib/zircon/rust:fuchsia-zircon",
      "//third_party/rust_crates:futures",
    ]

    if (defined(invoker.public_deps)) {
      foreach(dep, invoker.public_deps) {
        label = get_label_info(dep, "label_no_toolchain")
        deps += [ "${label}-rustc" ]
      }
    }

    if (defined(invoker.deps)) {
      foreach(dep, invoker.deps) {
        label = get_label_info(dep, "label_no_toolchain")
        deps += [ "${label}-rustc" ]
      }
    }

    non_rust_deps = [ ":$generation_target_name($banjo_toolchain)" ]
    source_root = rebase_path("$file_stem.rs")
    sources = [ rebase_path("$file_stem.rs") ]
  }
}

template("banjo_dummy_rust_library") {
  assert(is_fuchsia, "This template can only be used in $target_toolchain.")

  not_needed(invoker,
             [
               "sources",
               "name",
             ])

  rustc_target_name = "${target_name}-rustc"
  group(rustc_target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])
  }
}
