# 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/go/go_library.gni")
import("//build/go/toolchain.gni")

# Generates Go bindings for a FIDL library.
#
# Parameters
#
#  * library_name
#    - Required: The name of the FIDL library.
#    - Type: string
#
#  * fidl_gen_dir
#    - Required: The directory under which bindings should be generated.
#    - Type: path
#
#  * fidl_ir_json
#    - Required: The path to the associated FIDL IR JSON file.
#    - Type: path
#
#  * fidl_ir_target
#    - Required: The label of the target that generates the FIDL IR JSON file.
#    - Type: label
#
#  * testonly, visibility, public_deps
#    - Optional: Usual GN meanings.
#
template("fidl_go") {
  assert(current_toolchain == go_toolchain,
         "This template can only be used in the Go toolchain $go_toolchain.")

  assert(defined(invoker.library_name),
         "fidl_go(\"$target_name\") must define `library_name`")
  assert(defined(invoker.fidl_gen_dir),
         "fidl_go(\"$target_name\") must define `fidl_gen_dir`")
  assert(defined(invoker.fidl_ir_json),
         "fidl_go(\"$target_name\") must define `fidl_ir_json`")
  assert(defined(invoker.fidl_ir_target),
         "fidl_go(\"$target_name\") must define `fidl_ir_target`")

  main_target = target_name
  generation_target = "${target_name}_generate"

  forward_variables_from(invoker,
                         [
                           "fidl_gen_dir",
                           "library_name",
                         ])
  library_dir = "$fidl_gen_dir/$library_name.fidl"
  impl_filename = "$library_dir/impl.go"
  pkg_name_filename = "$library_dir/pkg_name"

  compiled_action(generation_target) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "fidl_ir_target",
                             "fidl_ir_json",
                           ])

    visibility = [
      ":*",
      "//tools/fidl/fidlgen_go:*",
    ]

    tool = "//tools/fidl/fidlgen_go"
    mnemonic = "FIDLGEN"

    inputs = [ fidl_ir_json ]

    outputs = [
      impl_filename,
      pkg_name_filename,
    ]

    args = [
      "--json",
      rebase_path(fidl_ir_json, root_build_dir),
      "--output-impl",
      rebase_path(impl_filename, root_build_dir),
      "--output-pkg-name",
      rebase_path(pkg_name_filename, root_build_dir),
      "--output-root-for-ide",
      rebase_path("$root_gen_dir/fidl_for_ide", root_build_dir),
    ]

    deps = [ fidl_ir_target ]

    metadata = {
      generated_sources = rebase_path(outputs, root_build_dir)
    }
  }

  go_library(main_target) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    name_file = pkg_name_filename

    source_dir = library_dir

    sources = [ "impl.go" ]

    non_go_deps = [ ":$generation_target" ]

    if (defined(invoker.public_deps)) {
      deps = []
      foreach(dep, invoker.public_deps) {
        deps += [ get_label_info(dep, "label_no_toolchain") + "_go" ]
      }
    }
  }
}
