# Copyright 2022 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/cpp/sdk_source_set.gni")
import("//build/zircon/migrated_targets.gni")

config("include") {
  include_dirs = [ "include" ]

  # TODO(https://fxbug.dev/349718971): Remove once the issue is addressed.
  defines = [ "_LIBCPP_ENABLE_REMOVED_ALLOCATOR_CONST" ]
}

wavl_tree_headers = [
  "include/lib/fidl/cpp/wire/internal/intrusive_container/node_utils.h",
  "include/lib/fidl/cpp/wire/internal/intrusive_container/container_utils.h",
  "include/lib/fidl/cpp/wire/internal/intrusive_container/pointer_traits.h",
  "include/lib/fidl/cpp/wire/internal/intrusive_container/wavl_tree.h",
  "include/lib/fidl/cpp/wire/internal/intrusive_container/wavl_tree_internal.h",
  "include/lib/fidl/cpp/wire/internal/intrusive_container/helper_macros.h",
]

sdk_source_set("wire") {
  category = "partner"
  sdk_name = "fidl_cpp_wire"

  build_as_static = true
  stable = true

  public = [
    "include/lib/fidl/cpp/wire/arena.h",
    "include/lib/fidl/cpp/wire/array.h",
    "include/lib/fidl/cpp/wire/coding_errors.h",
    "include/lib/fidl/cpp/wire/decoded_value.h",
    "include/lib/fidl/cpp/wire/envelope.h",
    "include/lib/fidl/cpp/wire/incoming_message.h",
    "include/lib/fidl/cpp/wire/internal/coding_config.h",
    "include/lib/fidl/cpp/wire/internal/display_error.h",
    "include/lib/fidl/cpp/wire/internal/transport.h",
    "include/lib/fidl/cpp/wire/message_storage.h",
    "include/lib/fidl/cpp/wire/object_view.h",
    "include/lib/fidl/cpp/wire/optional.h",
    "include/lib/fidl/cpp/wire/outgoing_message.h",
    "include/lib/fidl/cpp/wire/string_view.h",
    "include/lib/fidl/cpp/wire/traits.h",
    "include/lib/fidl/cpp/wire/vector_view.h",
    "include/lib/fidl/cpp/wire/wire_coding_traits.h",
    "include/lib/fidl/cpp/wire/wire_decoder.h",
    "include/lib/fidl/cpp/wire/wire_encoder.h",
    "include/lib/fidl/cpp/wire/wire_types.h",
  ]
  if (is_fuchsia) {
    public += [
      "include/lib/fidl/cpp/wire/async_binding.h",
      "include/lib/fidl/cpp/wire/async_transaction.h",
      "include/lib/fidl/cpp/wire/base_wire_result.h",
      "include/lib/fidl/cpp/wire/channel.h",
      "include/lib/fidl/cpp/wire/client.h",
      "include/lib/fidl/cpp/wire/client_base.h",
      "include/lib/fidl/cpp/wire/connect_service.h",
      "include/lib/fidl/cpp/wire/extract_resource_on_destruction.h",
      "include/lib/fidl/cpp/wire/internal/arrow.h",
      "include/lib/fidl/cpp/wire/internal/client_continuation.h",
      "include/lib/fidl/cpp/wire/internal/client_details.h",
      "include/lib/fidl/cpp/wire/internal/endpoints.h",
      "include/lib/fidl/cpp/wire/internal/framework_err.h",
      "include/lib/fidl/cpp/wire/internal/make_response_context.h",
      "include/lib/fidl/cpp/wire/internal/server_details.h",
      "include/lib/fidl/cpp/wire/internal/synchronization_checker.h",
      "include/lib/fidl/cpp/wire/internal/thenable.h",
      "include/lib/fidl/cpp/wire/message.h",
      "include/lib/fidl/cpp/wire/server.h",
      "include/lib/fidl/cpp/wire/service_handler.h",
      "include/lib/fidl/cpp/wire/status.h",
      "include/lib/fidl/cpp/wire/sync_call.h",
      "include/lib/fidl/cpp/wire/transaction.h",
      "include/lib/fidl/cpp/wire/unknown_interaction_handler.h",
      "include/lib/fidl/cpp/wire/unknown_interactions.h",
      "include/lib/fidl/cpp/wire/wire_coding_common.h",
      "include/lib/fidl/cpp/wire/wire_messaging.h",
      "include/lib/fidl/cpp/wire/wire_messaging_declarations.h",
    ]
  }
  if (is_fuchsia) {
    public += [ "include/lib/fidl/cpp/wire/internal/transport_channel.h" ]
  } else {
    public += [ "include/lib/fidl/cpp/wire/internal/transport_channel_host.h" ]
  }
  public += wavl_tree_headers

  sdk_headers_for_internal_use =
      [ "include/lib/fidl/cpp/wire/internal/transport.h" ]
  if (is_fuchsia) {
    sdk_headers_for_internal_use += [
      "include/lib/fidl/cpp/wire/internal/arrow.h",
      "include/lib/fidl/cpp/wire/internal/client_continuation.h",
      "include/lib/fidl/cpp/wire/internal/client_details.h",
      "include/lib/fidl/cpp/wire/internal/endpoints.h",
      "include/lib/fidl/cpp/wire/internal/make_response_context.h",
      "include/lib/fidl/cpp/wire/internal/server_details.h",
      "include/lib/fidl/cpp/wire/internal/thenable.h",
      "include/lib/fidl/cpp/wire/internal/synchronization_checker.h",
    ]
  }
  if (is_fuchsia) {
    sdk_headers_for_internal_use +=
        [ "include/lib/fidl/cpp/wire/internal/transport_channel.h" ]
  } else {
    sdk_headers_for_internal_use +=
        [ "include/lib/fidl/cpp/wire/internal/transport_channel_host.h" ]
  }
  sdk_headers_for_internal_use += wavl_tree_headers

  sources = [
    "arena.cc",
    "coding_errors.cc",
    "display_error.cc",
    "incoming_message.cc",
    "message.cc",
    "message_storage.cc",
    "outgoing_message.cc",
    "status.cc",
    "transport.cc",
    "wire_coding_traits.cc",
    "wire_decoder.cc",
    "wire_encoder.cc",
    "wire_messaging.cc",
    "wire_types.cc",
  ]
  if (is_fuchsia) {
    sources += [
      "async_binding.cc",
      "async_transaction.cc",
      "client_base.cc",
      "client_details.cc",
      "server.cc",
      "thenable.cc",
      "transaction.cc",
      "unknown_interactions.cc",
    ]
  }
  if (is_fuchsia) {
    sources += [ "transport_channel.cc" ]
  } else {
    sources += [ "transport_channel_host.cc" ]
  }

  public_deps = [
    # <lib/fidl/cpp/wire/wire_messaging.h> has #include <lib/fit/function.h>.
    "//sdk/lib/fit",

    # Validating UTF-8 strings.
    "//sdk/lib/utf-utils",

    # Syscall headers.
    "//src/zircon/lib/zircon",

    # Various result-returning API uses #include <lib/zx/result.h>.
    "//zircon/system/ulib/zx",

    # <lib/fidl/cpp/wire/message.h> has #include <lib/fidl/cpp/transaction_header.h>
    "//sdk/lib/fidl_base",
  ]

  if (is_fuchsia) {
    public_deps += [
      # synchronization_checker.h has #include <lib/async/cpp/sequence_checker.h>
      "//sdk/lib/async:async-cpp",

      # <lib/fidl/cpp/wire/async_binding.h> has #include <lib/async/dispatcher.h>
      "//sdk/lib/async",

      # <lib/fidl/cpp/wire/async_binding.h> has #include <lib/sync/completion.h>
      "//zircon/system/ulib/sync",

      # <lib/fidl/cpp/wire/traits.h> has #include <lib/zx/object.h>.
      "//zircon/system/ulib/zx",

      # <lib/fidl/cpp/wire/internal/transport_channel.h> has
      # #include <lib/fidl/epitaph.h>
      "//sdk/lib/fidl",
    ]
  }

  # TODO(https://fxbug.dev/42052612): GN check fails without this condition.
  if (zircon_toolchain != false) {
    public_deps += [ "//zircon/system/public" ]
  }

  public_configs = [ ":include" ]
}
