# 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)", "root_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 = "${dep_out_dir}/lib.wasm"
    } else {
      file_name = "${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 = [
      rebase_path(file_name, root_build_dir),
      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",
    ]
  }
}
