# 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,
#     "//sdk/fidl/fuchsia.sys2" for fuchsia.sys2.
#
#   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"

  # Subtle: rebase dance, so that we allow paths up to and including the build
  # dir to contain periods:
  include_stem =
      string_replace(rebase_path(target_gen_dir, root_build_dir), ".", "/")
  file_stem = "$root_build_dir/$include_stem/$source_base"

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

    visibility = [ ":$main_target_name" ]

    tool = "//tools/fidl/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
    }
  }
}
