# 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")

# Merge one or more json files.
#
# If any input is not a valid JSON, the merge operation will fail. Consequently
# you can "merge" one JSON file to perform validation.
# If any two inputs overlap in key space, the merge operation will fail.
# Optionally the merged output can be minified. Consequently you can "merge"
# one JSON file to perform minification.
#
# Parameters
#
#   sources (required)
#     [files list] One or more JSON files to merge.
#
#   minify (optional)
#     [boolean] Whether to minify the result.
#     Minified JSON is functionally equivalent but less readable to humans.
#
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
#
# Example of usage:
#
#   json_merge("merged.json") {
#     sources = [ "one.json", "two.json" ]
#     minify = true
#   }
template("json_merge") {
  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "sources",
                             "testonly",
                             "visibility",
                             "minify",
                           ])

    tool = "//build/tools/json_merge"

    merged_output = "$target_out_dir/$target_name"
    outputs = [ merged_output ]

    args = []
    foreach(source, sources) {
      args += [
        "--input",
        rebase_path(source, root_build_dir),
      ]
    }
    args += [
      "--output",
      rebase_path(merged_output, root_build_dir),
    ]
    if (defined(minify) && minify) {
      args += [ "--minify" ]
    }
  }
}
