# Copyright 2013 The Flutter 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("//flutter/tools/executable_action.gni")
import("//flutter/tools/fuchsia/dart/dart_library.gni")
import("//flutter/tools/fuchsia/dart/toolchain.gni")
import("//flutter/tools/fuchsia/fidl/fidl.gni")
import("//flutter/tools/fuchsia/fidl/toolchain.gni")
import("//flutter/tools/fuchsia/gn-sdk/config/config.gni")

# Generates some Dart bindings for a FIDL library.
#
# The parameters for this template are defined in //flutter/tools/fuchsia/fidl/fidl.gni. The
# relevant parameters in this template are:
#   - name;

template("fidl_dart") {
  assert(current_toolchain == dart_toolchain,
         "This template can only be used in the $dart_toolchain toolchain.")

  not_needed(invoker,
             [
               "meta",
               "sources",
             ])

  main_target_name = target_name
  generation_target_name = "${target_name}_dart_generate"

  library_name = target_name
  root_dir = "$target_gen_dir/${library_name}_package"
  if (defined(invoker.name)) {
    library_name = invoker.name
    root_dir = "$target_gen_dir/${target_name}_${library_name}_package"
  }
  bindings_dir = "$root_dir/lib"
  async_bindings_file = "$bindings_dir/fidl_async.dart"
  test_bindings_file = "$bindings_dir/fidl_test.dart"

  fidl_target_gen_dir =
      get_label_info(":bogus($fidl_toolchain)", "target_gen_dir")
  json_representation = "$fidl_target_gen_dir/$target_name.fidl.json"

  executable_action(generation_target_name) {
    visibility = [ ":*" ]

    tool = "${fuchsia_tool_dir}/fidlgen_dart"

    inputs = [ json_representation ]

    outputs = [
      async_bindings_file,
      test_bindings_file,
    ]

    args = [
      "--json",
      rebase_path(json_representation, root_build_dir),
      "--output-async",
      rebase_path(async_bindings_file, root_build_dir),
      "--output-test",
      rebase_path(test_bindings_file, root_build_dir),
    ]

    deps = [ ":$main_target_name($fidl_toolchain)" ]
    forward_variables_from(invoker, [ "testonly" ])
  }

  dart_library(main_target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    package_root = root_dir

    package_name = "fidl_" + string_replace(library_name, ".", "_")

    null_safe = true

    sources = [
      rebase_path(async_bindings_file, bindings_dir),
      rebase_path(test_bindings_file, bindings_dir),
    ]

    deps = [ ":$generation_target_name" ]

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

    # invoker.deps are the non_fidl_deps passed in to the fidl() rule
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}
