# 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/compiled_action.gni")
import("//build/fidl/toolchain.gni")
import("//build/rust/rustc_library.gni")
import("//build/rust/toolchain.gni")

# Declares the rustc_library invocation for the generated FIDL bindings.

template("fidl_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 = "fidl_" + string_replace(library_name, ".", "_")

  fidl_target_gen_dir =
      get_label_info(":bogus($fidl_toolchain)", "target_gen_dir")
  file_stem = "$fidl_target_gen_dir/${underscore_name}"

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

    if (is_fuchsia) {
      deps += [
        "//src/lib/fuchsia-async",
        "//src/lib/zircon/rust:fuchsia-zircon",
      ]
    }

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