# 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/cpp/fidlmerge_cpp.gni")

# Declares a fostr library that contains C++ ostream formatting for a FIDL
# library.
#
# Parameters
#
#   fidl_target (required)
#     Specifies the fidl target from which to read fidl json. For example,
#     "//zircon/public/fidl/fuchsia-mem:fuchsia-mem_sdk" for fuchsia.mem or
#     "//garnet/public/fidl/fuchsia.sys" for fuchsia.sys.
#
#   template_path (optional)
#     Specifies the template to use to generate the formatting code. Default
#     //garnet/public/build/fostr/fostr.fidlmerge.
#
#   additional_include (optional)
#     Specifies a file to be included in the generated formatting.h file.
#     For example "lib/ui/views/cpp/formatting.h".
#
#   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("fostr_fidl") {
  assert(defined(invoker.fidl_target),
         "fostr_fidl requires parameter fidl_target.")

  fidl_target = invoker.fidl_target

  template_path = "//garnet/public/build/fostr/fostr.fidlmerge"
  if (defined(invoker.template_path)) {
    template_path = invoker.template_path
  }

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

    fidl_target = "$fidl_target"

    template_path = "$template_path"

    generated_source_base = "formatting"

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

    public_deps = [
      "$fidl_target",
      "//garnet/public/lib/fostr",
    ]

    if (defined(invoker.public_deps)) {
      public_deps += invoker.public_deps
    }
  }
}
