# 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" ])

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

  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($rust_toolchain)" ]
    source_root = rebase_path("$file_stem.rs")
  }
}
