# Copyright 2022 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/fidl/fidl_summary.gni")
import("//build/fidl/fidlc.gni")

# Compiles a FIDL library to IR and optionally generates API summaries.
#
# Compilation parameters
#
#   fidl_target_name (required)
#     [string] The name of the `fidl` target declaration.
#
#   fidl_library_name (required)
#     [string] The name of the `fidl` library.
#
#   gen_dir (required)
#     [path] Effectively replaces target_gen_dir. This is used to prevent
#     multiple fidl targets from generating the same output files.
#
#   json_representation (required)
#     [path] Where to generate the FIDL IR. Must be relative to gen_dir.
#
#   target_api_level (required)
#     [string] Only compile APIs available at this Fuchsia API level. For more
#     information, look for --available in `fidlc --help`.
#
#   out_json_summary
#     [path] If set, generates a JSON API summary file at the given path.
#     Must be relative to gen_dir.
#
# Other parameters (see //build/fidl/fidl.gni for descriptions):
#
#   available (required)
#   sources (required)
#   experimental_flags
#   goldens_dir
#   non_fidl_deps
#   public_deps
#   testonly
#   versioned
#   visibility
#
template("fidl_ir") {
  assert(
      current_toolchain == fidl_toolchain,
      "This template can only be used in the FIDL toolchain $fidl_toolchain.")

  assert(defined(invoker.fidl_target_name), "fidl_target_name is required")
  assert(defined(invoker.fidl_library_name), "fidl_library_name is required")
  assert(defined(invoker.gen_dir), "gen_dir is required")
  assert(defined(invoker.json_representation),
         "json_representation is required")
  assert(defined(invoker.available), "available is required")
  assert(defined(invoker.sources), "sources is required")

  main_target_deps = []

  fidlc_target_name = "${target_name}_fidlc"
  fidlc(fidlc_target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "goldens_dir",
                             "out_json_summary",
                             "visibility",
                             "target_api_level",
                           ])
    visibility = [ ":*" ]
  }

  main_target_deps += [ ":$fidlc_target_name" ]

  if (defined(invoker.out_json_summary)) {
    fidl_summary_json_target_name = "${target_name}_summary_json"
    main_target_deps += [ ":$fidl_summary_json_target_name" ]
    fidl_summary_json(fidl_summary_json_target_name) {
      forward_variables_from(invoker, [ "testonly" ])
      visibility = [ ":*" ]
      inputs = [ invoker.json_representation ]
      outputs = [ invoker.out_json_summary ]
      deps = [ ":$fidlc_target_name" ]

      metadata = {
        _summary_basename = get_path_info(invoker.out_json_summary, "file")
        _new_golden_file = "${invoker.goldens_dir}/${invoker.target_api_level}/${_summary_basename}"

        compatibility_testing_goldens = [
          {
            api_level = invoker.target_api_level
            src = rebase_path(invoker.out_json_summary, root_build_dir)
            dst = rebase_path(_new_golden_file, root_build_dir)
          },
        ]
      }
    }
  }

  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    public_deps = main_target_deps
  }
}
