# 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
  }

  crate_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/$target_name/$crate_name"

  rustc_library(rustc_target_name) {
    name = crate_name
    output_dir = target_out_dir + "/" + target_name
    version = "0.1.0"
    edition = "2018"
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    deps = [
      "//src/lib/fidl/rust/fidl",
      "//src/lib/zerocopy",
      "//src/lib/zircon/rust:fuchsia-zircon-status",
      "//third_party/rust_crates:bitflags",
      "//third_party/rust_crates:futures",
      "//third_party/rust_crates:static_assertions",
    ]

    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 ]
      }
    }

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

    configs -= [ "//build/config/rust:allow_unused_results" ]
  }
}
