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

# Validate a JSON file against a JSON schema.
#
#   data (required)
#     [file] JSON file to validate.
#     If this file is not valid JSON, or does not meet the schema, then this
#     target will fail to build.
#
#   schema (required)
#     [file] Schema to use for validation.
#
#   sources (optional)
#     [list of files] Additional schema files referenced by schema.
#     Additional schema files used by the original schema file must be listed
#     here for validation to be re-run when they change.
#
#   allow_comments (optional; default is false)
#     [bool] If true, the |data| file may contain C-style comments
#     (`/* block */` and `// inline`) that will be ignored.
#
#   use_valico (optional; default is false)
#     [bool] If true, a valico-based validator will be used instead of the
#     previous rapidjson-based version.
#
#   applicable_licenses (optional)
#   deps (optional)
#   public_deps (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
#
# Example of usage:
#
#   validate_json("validate_my_json") {
#     data = "my_file.json"
#     schema = "my_schema.json"
#   }
template("validate_json") {
  assert(defined(invoker.data), "data is required")
  assert(defined(invoker.schema), "schema is required")
  allow_comments = defined(invoker.allow_comments) && invoker.allow_comments
  use_valico = defined(invoker.use_valico) && invoker.use_valico

  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "applicable_licenses",
                             "deps",
                             "sources",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    # The fact that the underlying binary is chosen by the `use_valico` variable
    # makes supporting the "previously built tools" strategy complicated. Don't
    # bother - it's fine to rebuild this tool multiple times in subbuilds.
    can_use_previously_built_tool = false

    if (use_valico) {
      tool = "//build/tools/json_validator:json_validator_valico"
    } else {
      tool = "//build/tools/json_validator"
    }

    stamp_file = "$target_gen_dir/$target_name.json_validated"

    inputs = [
      invoker.data,
      invoker.schema,
    ]

    outputs = [ stamp_file ]

    args = []

    if (allow_comments) {
      if (use_valico) {
        args += [ "--json5" ]
      } else {
        args += [ "--allow_comments" ]
      }
    }

    args += [
      rebase_path(invoker.schema, root_build_dir),
      rebase_path(invoker.data, root_build_dir),
      rebase_path(stamp_file, root_build_dir),
    ]
  }
}

# Validate a JSON5 file against a JSON schema.
#
#   data (required)
#     [file] JSON5 file to validate.
#     If this file is not valid JSON5, or does not meet the schema, then this
#     target will fail to build.
#
#   schema (required)
#     [file] Schema to use for validation.
#
#   sources (optional)
#     [list of files] Additional schema files referenced by schema.
#     Additional schema files used by the original schema file must be listed
#     here for validation to be re-run when they change.
#
#   applicable_licenses (optional)
#   deps (optional)
#   public_deps (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
#
# Example of usage:
#
#   validate_json5("validate_my_json") {
#     data = "my_file.json5"
#     schema = "my_schema.json"
#   }
template("validate_json5") {
  assert(defined(invoker.data), "data is required")
  assert(defined(invoker.schema), "schema is required")

  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "applicable_licenses",
                             "deps",
                             "sources",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    tool = "//build/tools/json_validator:json_validator_valico"
    stamp_file = "$target_gen_dir/$target_name.json5_validated"

    inputs = [
      invoker.data,
      invoker.schema,
    ]

    outputs = [ stamp_file ]

    args = [
      "--json5",
      rebase_path(invoker.schema, root_build_dir),
      rebase_path(invoker.data, root_build_dir),
      rebase_path(stamp_file, root_build_dir),
    ]
  }
}
