# 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("//build/fuchsia/sdk.gni")
import("//flutter/tools/fuchsia/dart/toolchain.gni")
import("//flutter/tools/fuchsia/fidl/toolchain.gni")

# Declares a FIDL library.
#
# Depending on the toolchain in which this targets is expanded, it will yield
# different results:
#   - in the FIDL toolchain, it will compile its source files into an
#     intermediate representation consumable by language bindings generators;
#   - in the target or shared toolchain, this will produce a source_set
#     containing language-specific bindings.
template("fidl") {
  # Allow generated targets visibility to their dependant generated targets
  if (defined(invoker.visibility)) {
    invoker.visibility += [ ":*" ]
  }

  assert(!defined(invoker.deps),
         "All FIDL dependencies are inherently " +
             "public, use 'public_deps' instead of 'deps'.")

  if (current_toolchain == dart_toolchain) {
    import("//flutter/tools/fuchsia/dart/fidl_dart.gni")

    not_needed(invoker, [ "meta" ])

    fidl_dart(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else if (current_toolchain == fidl_toolchain) {
    import("//flutter/tools/fuchsia/fidl/fidl_library.gni")

    not_needed(invoker, [ "meta" ])

    fidl_library(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else if (current_toolchain == default_toolchain) {
    not_needed(invoker,
               [
                 "name",
                 "sources",
               ])

    fuchsia_fidl_library(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else {
    not_needed("*")
  }
}
