# Copyright 2019 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 Apple Property List file into a single file.
#
# Arguments
#
#   - output
#
#       path of the file that will be generated (must be in a sub-directory
#       of root_build_dir)
#
#   - plists
#
#       list of path to Apple Property List file to merge (the file may be
#       in either "json", "binary1" or "xml1" format)
#
#   - format (optional)
#
#       format in which the file must be saved; must be one of "json",
#       "binary1" or "xml1" (default to "json" if omitted)
#
#   - substitutions (optional)
#
#       a scope defining variable substitutions to perform when merging the
#       Property List files (i.e. if scope define foo = "bar", occurences
#       of $(foo) in any string in a property list will be replaced by
#       bar)
#
template("merge_plist") {
  assert(defined(invoker.output) && invoker.output != "",
         "output must be defined for merge_plist ($target_name)")
  assert(defined(invoker.plists) && invoker.plists != [],
         "plists must be defined for merge_plist ($target_name)")

  if (defined(invoker.substitutions)) {
    assert(!defined(invoker.substitutions_json),
           "cannot define both substitutions and substitutions_json")

    _substitutions_json = "$target_out_dir/$target_name/substitutions.json"
    write_file(_substitutions_json, invoker.substitutions, "json")
  }

  if (defined(invoker.substitutions_json)) {
    _substitutions_json = invoker.substitutions_json
  }

  action(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "args",
                             "format",
                             "inputs",
                             "output",
                             "plists",
                             "script",
                             "sources",
                             "substitutions",
                             "substitutions_json",
                           ])

    script = "//build/config/ios/scripts/merge_plist.py"
    sources = invoker.plists
    outputs = [
      invoker.output,
    ]

    _format = "json"
    if (defined(invoker.format)) {
      _format = invoker.format
    }

    args = [
      "-f=" + _format,
      "-o=" + rebase_path(invoker.output, root_build_dir),
    ]

    if (defined(_substitutions_json)) {
      inputs = [
        _substitutions_json,
      ]
      args += [ "-s=" + rebase_path(_substitutions_json) ]
    }

    args += rebase_path(sources, root_build_dir)
  }
}
