# 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")
import("//build/dart/fidlmerge_dart.gni")
import("//build/dart/toolchain.gni")

# Declares a library that contains Dart JSON serialization/deserialization
# support for the given FIDL library
#
# Parameters
#
#   fidl_target (required)
#     Specifies the fidl target from which to read fidl json. For example,
#     "//garnet/public/fidl/fuchsia.setui" for fuchsia.setui.
#
#   template_path (optional)
#     Specifies the template to use to generate the formatting code. Default
#     //topaz/bin/dart_fidl_json/json.fidlmerge.
#
#   amendments_path (optional)
#     Specifies a JSON file that contains amendments to be made to the fidl
#     model before the template is applied. For example,
#     "//garnet/public/build/fostr/fidl/fuchsia.media/amendments.fidlmerge".
#     See the fidlmerge README for details.
#
#   deps, public_deps, test_only, visibility (optional)
#     These parameters are forwarded to the source_set. This template lists
#     //garnet/public/lib/fostr and the value of fidl_target as public_deps.
#

template("json_fidl") {
  assert(defined(invoker.fidl_target),
         "json_fidl requires parameter fidl_target.")

  fidl_target = invoker.fidl_target

  template_path = "//topaz/bin/dart_fidl_json/json.fidlmerge"
  if (defined(invoker.template_path)) {
    template_path = invoker.template_path
  }

  fidlmerge_dart(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                             "amendments_path",
                           ])

    fidl_target = "$fidl_target"

    template_path = "$template_path"

    generated_source_base = "json"

    if (defined(invoker.additional_include)) {
      options = "include=${invoker.additional_include}"
    }
  }
}
