# 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 = [
      "//garnet/public/rust/fuchsia-async",
      "//garnet/public/rust/fuchsia-ddk/fuchsia-ddk-sys",
      "//garnet/public/rust/fuchsia-zircon",
      "//third_party/rust_crates:futures-preview",
    ]

    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")
  }
}
