# Copyright 2020 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/rust/config.gni")

# Generates bindings for a WASM file.
#
# Parameters
#
#   target (required)
#     [label] The library target to create bindings for.
#
#   target_output_name (optional)
#     [string] The output name to expect, if different from the target label name.
#
#   deps (optional)
#   public_deps (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
#
# Example of usage:
#
#   wasm_bindings(format) {
#     target = ":lib"
#   }
template("wasm_bindings") {
  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    if (!defined(deps)) {
      deps = []
    }

    target = invoker.target
    deps += [ "${target}($unknown_wasm32_toolchain)" ]
    dep_out_dir =
        get_label_info("${target}($unknown_wasm32_toolchain)", "target_out_dir")

    if (defined(invoker.target_output_name)) {
      dep_name = invoker.target_output_name
    } else {
      dep_name = get_label_info(invoker.target, "name")
    }

    file_name = ""
    if (dep_name == "lib") {
      file_name = rebase_path("${dep_out_dir}/lib.wasm")
    } else {
      file_name = rebase_path("${dep_out_dir}/lib${dep_name}.wasm")
    }

    tool = "//src/diagnostics/wasm/bindgen:bin"
    tool_output_name = "fx_wasm_bindgen"

    output_dir = "$target_out_dir/$target_name"

    args = [
      file_name,
      rebase_path(output_dir, root_build_dir),
    ]

    output_file_name = get_path_info(file_name, "name")

    outputs = [
      "$target_out_dir/$target_name/${output_file_name}_bg.d.ts",
      "$target_out_dir/$target_name/${output_file_name}_bg.wasm",
      "$target_out_dir/$target_name/${output_file_name}.d.ts",
      "$target_out_dir/$target_name/${output_file_name}.js",
    ]
  }
}
