# 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/banjo/toolchain.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, ".", "_")
  dash_name = 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/$dash_name.args"

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

    visibility = [ ":*" ]

    tool = "//garnet/bin/banjo:banjo_bin"

    inputs = [ "//garnet/bin/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
    }
  }
}
