# 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/toolchain.gni")

# Generates some Rust bindings for a banjo library.
#
# The parameters for this template are defined in //build/banjo/banjo.gni. The
# relevant parameters in this template are:
#   - name.

template("banjo_rust") {
  assert(current_toolchain == rust_toolchain,
         "This template can only be used in $rust_toolchain.")

  not_needed(invoker, [ "sources" ])

  main_target_name = target_name
  generation_target_name = "${target_name}_rust_generate"

  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.rs"
  file_args = "$banjo_target_gen_dir/rust/$library_name.args"

  compiled_action(generation_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    visibility = [ ":*" ]

    tool = "//src/devices/tools/banjo:banjo_bin"

    inputs = [
      "//src/devices/tools/banjo/zx.banjo",
    ]
    inputs += invoker.sources

    outputs = [
      "$file_stem",
    ]

    args = [ "@" + rebase_path(file_args, root_build_dir) ]

    deps = [
      ":$main_target_name($banjo_toolchain)",
    ]
  }

  group(main_target_name) {
    forward_variables_from(invoker,
                           [
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    deps = [
      ":$generation_target_name",
    ]

    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}
