# Copyright 2014 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.

# Converts a .json file to a C++ struct.
#
# Variables:
#
#   source (required)
#       Single file name of source .json file.
#
#   schema_file (required)
#       Single file name of the .json file that defines the schema.
#
#   namespace (required)
#       Namespace name to put result in.
#
#   visibility (optional)
#       Normal meaning.
template("json_to_struct") {
  assert(defined(invoker.source), "source required in $target_name")
  assert(defined(invoker.schema_file), "schema_file required in $target_name")
  assert(defined(invoker.namespace), "namespace required in $target_name")

  action_name = target_name + "_action"
  source_set_name = target_name

  action(action_name) {
    visibility = [ ":$source_set_name" ]
    script = "//tools/json_to_struct/json_to_struct.py"

    inputs = [
      "//tools/json_to_struct/element_generator.py",
      "//tools/json_to_struct/struct_generator.py",
      invoker.source,
    ]

    out_dir = get_path_info(invoker.source, "gen_dir")
    out_name = get_path_info(invoker.source, "name")
    outputs = [
      "$out_dir/$out_name.cc",
      "$out_dir/$out_name.h",
    ]

    args = [
      rebase_path(invoker.source, root_build_dir),
      "--destbase=" + rebase_path(out_dir, root_build_dir),
      "--namespace=" + invoker.namespace,
      "--schema=" + rebase_path(invoker.schema_file, root_build_dir),
    ]
  }

  source_set(source_set_name) {
    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }

    sources = get_target_outputs(":$action_name")

    deps = [
      ":$action_name",
    ]
  }
}
