# 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")

# Declares a source_set that contains code generated by fidlmerge from a
# template and a FIDL JSON file.
#
# Parameters
#
#   fidl_target (required)
#     Specifies the fidl target from which to read fidl json. For example,
#     "//zircon/public/fidl/fuchsia-mem" for fuchsia.mem or
#     "//garnet/public/fidl/fuchsia.sys" for fuchsia.sys.
#
#   template_path (required)
#     Specifies the template to use to generate the source code for the
#     source_set. For example, "//garnet/public/build/fostr/fostr.fidlmerge".
#
#   generated_source_base (required)
#     The base file name from which the source_set's 'source' file names are
#     generated. For example, "formatting".
#
#   generated_source_extensions (optional)
#     The list of extensions of source_set 'source' files that will be generated
#     and included in the source set. By default, this is [ ".cc", ".h" ]
#
#   options (optional)
#     A single string with comma-separated key=value pairs.
#
#   amendments_path (optional)
#     Specifies a JSON file that contains amendments to be made to the fidl
#     model before the template is applied. For example,
#     "//garnet/public/build/fostr/fidl/fuchsia.media/amendments.fidlmerge".
#     See the fidlmerge README for details.
#
#   deps, public_deps, test_only, visibility (optional)
#     These parameters are forwarded to the source_set.
#

template("fidlmerge_cpp") {
  assert(defined(invoker.fidl_target),
         "fidlmerge_cpp requires parameter fidl_target.")

  assert(defined(invoker.template_path),
         "fidlmerge_cpp requires parameter template_path.")

  assert(defined(invoker.generated_source_base),
         "fidlmerge_cpp requires parameter generated_source_base.")

  fidl_target = invoker.fidl_target
  template_path = invoker.template_path
  source_base = invoker.generated_source_base

  if (defined(invoker.generated_source_extensions)) {
    generated_source_extensions = invoker.generated_source_extensions
  } else {
    generated_source_extensions = [
      ".cc",
      ".h",
    ]
  }

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

  fidl_target_gen_dir =
      get_label_info("$fidl_target($fidl_toolchain)", "target_gen_dir")
  fidl_target_name = get_path_info(fidl_target_gen_dir, "file")
  json_representation = "$fidl_target_gen_dir/$fidl_target_name.fidl.json"

  include_stem = string_replace(target_gen_dir, ".", "/")
  file_stem = "$include_stem/$source_base"

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

    visibility = [ ":$main_target_name" ]

    tool = "//garnet/go/src/fidlmerge"

    inputs = [
      json_representation,
      template_path,
    ]

    outputs = []
    foreach(ext, generated_source_extensions) {
      outputs += [ "$file_stem$ext" ]
    }

    args = [
      "--template",
      rebase_path(template_path, root_build_dir),
      "--json",
      rebase_path(json_representation, root_build_dir),
      "--output-base",
      rebase_path(file_stem, root_build_dir),
    ]

    if (defined(invoker.options)) {
      args += [
        "--options",
        invoker.options,
      ]
    }

    if (defined(invoker.amendments_path)) {
      args += [
        "--amend",
        rebase_path(invoker.amendments_path, root_build_dir),
      ]
    }

    deps = [
      "$fidl_target($fidl_toolchain)",
    ]

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

  source_set(main_target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])

    sources = []
    foreach(ext, generated_source_extensions) {
      sources += [ "$file_stem$ext" ]
    }

    public_deps = [
      ":$generation_target_name",
    ]
    if (defined(invoker.public_deps)) {
      public_deps += invoker.public_deps
    }
  }
}
