# Copyright 2021 The Chromium Authors. All rights reserved.
# 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" ]
  }
}
