# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Template to merge multiple plist files and perform variable substitutions.
#
# Arguments
#
#     plist_templates:
#         string array, paths to plist files which will be used for the bundle.
#
#     format:
#         string, the format to `plutil -convert` the plist to when
#         generating the output.
#
#     substitutions:
#         string array, 'key=value' pairs used to replace ${key} by value
#         when generating the output plist file.
#
#     output_name:
#         string, name of the generated plist file.
template("compile_plist") {
  assert(defined(invoker.plist_templates),
         "A list of template plist files must be specified for $target_name")
  assert(defined(invoker.format),
         "The plist format must be specified for $target_name")
  assert(defined(invoker.substitutions),
         "A list of key=value pairs must be specified for $target_name")
  assert(defined(invoker.output_name),
         "The name of the output file must be specified for $target_name")

  _output_name = invoker.output_name
  _merged_name = get_path_info(_output_name, "dir") + "/" +
                 get_path_info(_output_name, "name") + "_merged." +
                 get_path_info(_output_name, "extension")

  _merge_target = target_name + "_merge"

  action(_merge_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])

    script = "//build/apple/plist_util.py"
    sources = invoker.plist_templates
    outputs = [ _merged_name ]
    args = [
             "merge",
             "-f=" + invoker.format,
             "-o=" + rebase_path(_merged_name, root_build_dir),
           ] + rebase_path(invoker.plist_templates, root_build_dir)
  }

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    script = "//build/apple/plist_util.py"
    sources = [ _merged_name ]
    outputs = [ _output_name ]
    args = [
      "substitute",
      "-f=" + invoker.format,
      "-o=" + rebase_path(_output_name, root_build_dir),
      "-t=" + rebase_path(_merged_name, root_build_dir),
    ]
    foreach(_substitution, invoker.substitutions) {
      args += [ "-s=$_substitution" ]
    }
    deps = [ ":$_merge_target" ]
  }
}
