// WARNING: This file is machine generated by fidlgen.

#include <fidl/test.errorsyntax/cpp/wire_messaging.h>

#include <memory>

namespace test_errorsyntax {
[[maybe_unused]] constexpr uint64_t
    kExampleUseOfErrorSyntax_ComposedCallWhichMayFail_Ordinal =
        3565108794310607393lu;

[[maybe_unused]] constexpr ::fidl::MessageDynamicFlags
    kExampleUseOfErrorSyntax_ComposedCallWhichMayFail_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

extern "C" const fidl_type_t
    test_errorsyntax_parent_ParentUsesErrorSyntaxComposedCallWhichMayFailRequestTable;

extern "C" const fidl_type_t
    test_errorsyntax_parent_ParentUsesErrorSyntaxComposedCallWhichMayFailTopResponseTable;

[[maybe_unused]] constexpr uint64_t
    kExampleUseOfErrorSyntax_CallWhichMayFail_Ordinal = 3757408930698888354lu;

[[maybe_unused]] constexpr ::fidl::MessageDynamicFlags
    kExampleUseOfErrorSyntax_CallWhichMayFail_DynamicFlags =
        ::fidl::MessageDynamicFlags::kStrictMethod;

extern "C" const fidl_type_t
    test_errorsyntax_ExampleUseOfErrorSyntaxCallWhichMayFailRequestTable;

extern "C" const fidl_type_t
    test_errorsyntax_ExampleUseOfErrorSyntaxCallWhichMayFailTopResponseTable;
#ifdef __Fuchsia__
}  // namespace test_errorsyntax
::fidl::WireResult<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    WireResult(
        ::fidl::UnownedClientEnd<::test_errorsyntax::ExampleUseOfErrorSyntax>
            client,
        ::fidl::internal::TransactionalRequest<
            ::test_errorsyntax::ExampleUseOfErrorSyntax::
                ComposedCallWhichMayFail>* request) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::
              ComposedCallWhichMayFail>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>>(
      client.handle(), bytes_.data(), static_cast<uint32_t>(bytes_.size()));
  SetStatus(outgoing);
  if (ok()) {
    auto* raw_response = reinterpret_cast<
        ::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::
                                 ComposedCallWhichMayFail>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else if (raw_response->result.is_response()) {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
}

::fidl::WireResult<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    WireResult(
        ::fidl::UnownedClientEnd<::test_errorsyntax::ExampleUseOfErrorSyntax>
            client,
        ::fidl::internal::TransactionalRequest<
            ::test_errorsyntax::ExampleUseOfErrorSyntax::
                ComposedCallWhichMayFail>* request,
        zx_time_t deadline) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::
              ComposedCallWhichMayFail>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>>(
      client.handle(), bytes_.data(), static_cast<uint32_t>(bytes_.size()),
      fidl::CallOptions{.deadline = deadline});
  SetStatus(outgoing);
  if (ok()) {
    auto* raw_response = reinterpret_cast<
        ::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::
                                 ComposedCallWhichMayFail>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else if (raw_response->result.is_response()) {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
}
namespace test_errorsyntax {
#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace test_errorsyntax
::fidl::WireUnownedResult<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    WireUnownedResult(
        ::fidl::UnownedClientEnd<::test_errorsyntax::ExampleUseOfErrorSyntax>
            client_end,
        ::fidl::internal::AnyBufferAllocator& allocator,
        ::fidl::internal::TransactionalRequest<
            ::test_errorsyntax::ExampleUseOfErrorSyntax::
                ComposedCallWhichMayFail>* request) {
  constexpr uint32_t buffer_size = ::fidl::SyncClientMethodBufferSizeInChannel<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>();
  ::fitx::result<::fidl::Error, ::fidl::BufferSpan> allocation =
      allocator.TryAllocate(buffer_size);
  if (!allocation.is_ok()) {
    ::fidl::Status::operator=(allocation.error_value());
    return;
  }
  uint8_t* buffer = allocation->data;
  constexpr uint32_t request_byte_capacity =
      ::fidl::MaxSizeInChannel<::fidl::internal::TransactionalRequest<
                                   ::test_errorsyntax::ExampleUseOfErrorSyntax::
                                       ComposedCallWhichMayFail>,
                               ::fidl::MessageDirection::kSending>();
  uint8_t* request_bytes = buffer;
  static_assert(buffer_size > request_byte_capacity);
  uint32_t response_byte_capacity = buffer_size - request_byte_capacity;
  uint8_t* response_bytes = &buffer[request_byte_capacity];

  ::fidl::unstable::UnownedEncodedMessage<
      ::fidl::internal::TransactionalRequest<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::
              ComposedCallWhichMayFail>>
      request_message(request_bytes, request_byte_capacity, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>>(
      client_end.handle(), response_bytes, response_byte_capacity);
  bytes_ = response_bytes;
  if (outgoing.ok()) {
    auto* raw_response = reinterpret_cast<
        ::fidl::WireResponse<::test_errorsyntax::ExampleUseOfErrorSyntax::
                                 ComposedCallWhichMayFail>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else if (raw_response->result.is_response()) {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  ::fidl::Status::operator=(outgoing);
}
namespace test_errorsyntax {
#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace test_errorsyntax
::fidl::WireResult<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    WireResult(
        ::fidl::UnownedClientEnd<::test_errorsyntax::ExampleUseOfErrorSyntax>
            client,
        ::fidl::internal::TransactionalRequest<
            ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>*
            request) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>>(
      client.handle(), bytes_.data(), static_cast<uint32_t>(bytes_.size()));
  SetStatus(outgoing);
  if (ok()) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else if (raw_response->result.is_response()) {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
}

::fidl::WireResult<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    WireResult(
        ::fidl::UnownedClientEnd<::test_errorsyntax::ExampleUseOfErrorSyntax>
            client,
        ::fidl::internal::TransactionalRequest<
            ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>*
            request,
        zx_time_t deadline) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>>(
      client.handle(), bytes_.data(), static_cast<uint32_t>(bytes_.size()),
      fidl::CallOptions{.deadline = deadline});
  SetStatus(outgoing);
  if (ok()) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else if (raw_response->result.is_response()) {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
}
namespace test_errorsyntax {
#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace test_errorsyntax
::fidl::WireUnownedResult<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    WireUnownedResult(
        ::fidl::UnownedClientEnd<::test_errorsyntax::ExampleUseOfErrorSyntax>
            client_end,
        ::fidl::internal::AnyBufferAllocator& allocator,
        ::fidl::internal::TransactionalRequest<
            ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>*
            request) {
  constexpr uint32_t buffer_size = ::fidl::SyncClientMethodBufferSizeInChannel<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>();
  ::fitx::result<::fidl::Error, ::fidl::BufferSpan> allocation =
      allocator.TryAllocate(buffer_size);
  if (!allocation.is_ok()) {
    ::fidl::Status::operator=(allocation.error_value());
    return;
  }
  uint8_t* buffer = allocation->data;
  constexpr uint32_t request_byte_capacity = ::fidl::MaxSizeInChannel<
      ::fidl::internal::TransactionalRequest<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>,
      ::fidl::MessageDirection::kSending>();
  uint8_t* request_bytes = buffer;
  static_assert(buffer_size > request_byte_capacity);
  uint32_t response_byte_capacity = buffer_size - request_byte_capacity;
  uint8_t* response_bytes = &buffer[request_byte_capacity];

  ::fidl::unstable::UnownedEncodedMessage<
      ::fidl::internal::TransactionalRequest<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>>
      request_message(request_bytes, request_byte_capacity, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>>(
      client_end.handle(), response_bytes, response_byte_capacity);
  bytes_ = response_bytes;
  if (outgoing.ok()) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else if (raw_response->result.is_response()) {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  ::fidl::Status::operator=(outgoing);
}
namespace test_errorsyntax {
#endif  // __Fuchsia__

}  // namespace test_errorsyntax
#ifdef __Fuchsia__

::fidl::internal::WireThenable<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>
fidl::internal::WireWeakAsyncClientImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::
    ComposedCallWhichMayFail(::fidl::StringView s) {
  ::fidl::internal::TransactionalRequest<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>
      _request{s};
  return ::fidl::internal::WireThenable<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>{
      _client_base(), ::fidl::WriteOptions{},
      ::fidl::internal::AllowUnownedInputRef{}, &_request};
}

::fidl::internal::WireThenable<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>
fidl::internal::WireWeakAsyncClientImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::
    CallWhichMayFail(::fidl::StringView s) {
  ::fidl::internal::TransactionalRequest<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>
      _request{s};
  return ::fidl::internal::WireThenable<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>{
      _client_base(), ::fidl::WriteOptions{},
      ::fidl::internal::AllowUnownedInputRef{}, &_request};
}
::fidl::internal::WireBufferThenable<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>
fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::
    ComposedCallWhichMayFail(::fidl::StringView s) {
  constexpr uint32_t _buffer_size =
      ::fidl::AsyncClientMethodBufferSizeInChannel<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::
              ComposedCallWhichMayFail>();
  ::fidl::internal::TransactionalRequest<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>
      _request{s};
  return ::fidl::internal::WireBufferThenable<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>{
      _client_base(), ::fidl::WriteOptions{}, _allocator(), _buffer_size,
      &_request};
}
::fidl::internal::WireBufferThenable<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>
fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::
    CallWhichMayFail(::fidl::StringView s) {
  constexpr uint32_t _buffer_size =
      ::fidl::AsyncClientMethodBufferSizeInChannel<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>();
  ::fidl::internal::TransactionalRequest<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>
      _request{s};
  return ::fidl::internal::WireBufferThenable<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>{
      _client_base(), ::fidl::WriteOptions{}, _allocator(), _buffer_size,
      &_request};
}

::fidl::WireResult<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>
fidl::internal::WireWeakSyncClientImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::
    ComposedCallWhichMayFail(::fidl::StringView s) {
  return _client_base()->MakeSyncCallWith([&](std::shared_ptr<
                                              ::fidl::internal::AnyTransport>
                                                  _transport) {
    ::fidl::internal::TransactionalRequest<
        ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>
        _request{s};
    return ::fidl::WireResult<
        ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>(
        ::fidl::UnownedClientEnd<::test_errorsyntax::ExampleUseOfErrorSyntax>(
            _transport->get<::fidl::internal::ChannelTransport>()),
        &_request);
  });
}

::fidl::WireResult<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>
fidl::internal::WireWeakSyncClientImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::
    CallWhichMayFail(::fidl::StringView s) {
  return _client_base()->MakeSyncCallWith(
      [&](std::shared_ptr<::fidl::internal::AnyTransport> _transport) {
        ::fidl::internal::TransactionalRequest<
            ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>
            _request{s};
        return ::fidl::WireResult<
            ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>(
            ::fidl::UnownedClientEnd<
                ::test_errorsyntax::ExampleUseOfErrorSyntax>(
                _transport->get<::fidl::internal::ChannelTransport>()),
            &_request);
      });
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

::fidl::Status
fidl::WireSyncEventHandler<::test_errorsyntax::ExampleUseOfErrorSyntax>::
    HandleOneEvent(
        ::fidl::UnownedClientEnd<::test_errorsyntax::ExampleUseOfErrorSyntax>
            client_end) {
  zx_status_t status = client_end.channel()->wait_one(
      ZX_CHANNEL_READABLE | ZX_CHANNEL_PEER_CLOSED, ::zx::time::infinite(),
      nullptr);
  if (status != ZX_OK) {
    return ::fidl::Status::TransportError(
        status, ::fidl::internal::kErrorWaitOneFailed);
  }
  constexpr uint32_t kHandleAllocSize = ([]() constexpr {
    uint32_t x = 0;
    if (x > ZX_CHANNEL_MAX_MSG_HANDLES) {
      x = ZX_CHANNEL_MAX_MSG_HANDLES;
    }
    return x;
  })();
  static_assert(kHandleAllocSize <= ZX_CHANNEL_MAX_MSG_HANDLES);
  ::fidl::internal::InlineMessageBuffer<48> read_storage;
  std::array<zx_handle_t, kHandleAllocSize> read_handles;
  // TODO(fxbug.dev/85734) Remove this channel-specific allocation.
  std::array<fidl_channel_handle_metadata_t, kHandleAllocSize>
      read_handle_metadata;
  ::fidl::IncomingMessage msg = ::fidl::MessageRead(
      zx::unowned_channel(client_end.handle()), read_storage.view(),
      read_handles.data(), read_handle_metadata.data(), kHandleAllocSize,
      ReadOptions{.discardable = true});
  if (msg.status() == ZX_ERR_BUFFER_TOO_SMALL) {
    // Message size is unexpectedly larger than calculated.
    // This can only be due to a newer version of the protocol defining a new
    // event, whose size exceeds the maximum of known events in the current
    // protocol.
    return ::fidl::Status::UnexpectedMessage(
        ZX_ERR_BUFFER_TOO_SMALL,
        ::fidl::internal::kErrorSyncEventBufferTooSmall);
  }
  if (!msg.ok()) {
    return msg;
  }
  fidl_message_header_t* hdr = msg.header();
  switch (hdr->ordinal) {
    default: {
      return ::fidl::Status::UnknownOrdinal();
    }
  }
}

std::optional<::fidl::UnbindInfo> fidl::internal::WireEventDispatcher<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::
    DispatchEvent(
        ::fidl::IncomingMessage& msg,
        ::fidl::internal::IncomingTransportContext transport_context) {
  switch (msg.header()->ordinal) {
    default:
      break;
  }
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::WireServerDispatcher<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::entries_[] = {
    {
        ::test_errorsyntax::
            kExampleUseOfErrorSyntax_ComposedCallWhichMayFail_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fidl::unstable::DecodedMessage<
              ::fidl::internal::TransactionalRequest<
                  ::test_errorsyntax::ExampleUseOfErrorSyntax::
                      ComposedCallWhichMayFail>>
              decoded{std::move(msg)};
          if (unlikely(!decoded.ok())) {
            return decoded.status();
          }
          auto* primary = &decoded.PrimaryObject()->body;
          ::fidl::internal::WireCompleter<
              ::test_errorsyntax::ExampleUseOfErrorSyntax::
                  ComposedCallWhichMayFail>::Sync completer(txn);
          reinterpret_cast<
              ::fidl::WireServer<::test_errorsyntax::ExampleUseOfErrorSyntax>*>(
              interface)
              ->ComposedCallWhichMayFail(primary, completer);
          return ZX_OK;
        },
    },
    {
        ::test_errorsyntax::kExampleUseOfErrorSyntax_CallWhichMayFail_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fidl::unstable::DecodedMessage<
              ::fidl::internal::TransactionalRequest<
                  ::test_errorsyntax::ExampleUseOfErrorSyntax::
                      CallWhichMayFail>>
              decoded{std::move(msg)};
          if (unlikely(!decoded.ok())) {
            return decoded.status();
          }
          auto* primary = &decoded.PrimaryObject()->body;
          ::fidl::internal::WireCompleter<
              ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
              Sync completer(txn);
          reinterpret_cast<
              ::fidl::WireServer<::test_errorsyntax::ExampleUseOfErrorSyntax>*>(
              interface)
              ->CallWhichMayFail(primary, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::WireServerDispatcher<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::entries_end_ = &entries_[2];

::fidl::DispatchResult fidl::internal::WireServerDispatcher<
    ::test_errorsyntax::ExampleUseOfErrorSyntax>::
    TryDispatch(
        ::fidl::WireServer<::test_errorsyntax::ExampleUseOfErrorSyntax>* impl,
        ::fidl::IncomingMessage& msg,
        internal::IncomingTransportContext transport_context,
        ::fidl::Transaction* txn) {
  return ::fidl::internal::TryDispatch(impl, msg, std::move(transport_context),
                                       txn, entries_, entries_end_);
}

void fidl::internal::
    WireServerDispatcher<::test_errorsyntax::ExampleUseOfErrorSyntax>::Dispatch(
        ::fidl::WireServer<::test_errorsyntax::ExampleUseOfErrorSyntax>* impl,
        ::fidl::IncomingMessage&& msg,
        internal::IncomingTransportContext transport_context,
        ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::WireServer<::test_errorsyntax::ExampleUseOfErrorSyntax>::
    dispatch_message(
        ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
        ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::WireServerDispatcher<
      ::test_errorsyntax::ExampleUseOfErrorSyntax>::
      Dispatch(this, std::move(msg), std::move(transport_context), txn);
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__
void fidl::internal::WireCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    Reply(::test_errorsyntax_parent::wire::
              ParentUsesErrorSyntaxComposedCallWhichMayFailResult result) {
  ::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>
      _response{result};
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalResponse<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::
              ComposedCallWhichMayFail>,
      ::fidl::internal::ChannelTransport>
      _response_message{::fidl::internal::AllowUnownedInputRef{}, &_response};
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}
void fidl::internal::WireCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    ReplySuccess(int64_t value) {
  ::test_errorsyntax_parent::wire::
      ParentUsesErrorSyntaxComposedCallWhichMayFailResponse _response =
          ::test_errorsyntax_parent::wire::
              ParentUsesErrorSyntaxComposedCallWhichMayFailResponse{
                  .value = std::move(value),
              };

  return Reply(
      ::test_errorsyntax_parent::wire::
          ParentUsesErrorSyntaxComposedCallWhichMayFailResult::WithResponse(
              ::fidl::ObjectView<
                  ::test_errorsyntax_parent::wire::
                      ParentUsesErrorSyntaxComposedCallWhichMayFailResponse>::
                  FromExternal(&_response)));
}

void fidl::internal::WireCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    ReplyError(uint32_t error) {
  return Reply(::test_errorsyntax_parent::wire::
                   ParentUsesErrorSyntaxComposedCallWhichMayFailResult::WithErr(
                       std::move(error)));
}

void fidl::internal::WireBufferCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    Reply(::test_errorsyntax_parent::wire::
              ParentUsesErrorSyntaxComposedCallWhichMayFailResult result) {
  ::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>
      _response{result};
  constexpr uint32_t _buffer_size = ::fidl::ServerReplyBufferSizeInChannel<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>();
  ::fitx::result<::fidl::Error, ::fidl::BufferSpan> _allocation =
      _allocator().TryAllocate(_buffer_size);
  if (!_allocation.is_ok()) {
    ::fidl::OutgoingMessage _failure{_allocation.error_value()};
    return _core()->SendReply(&_failure,
                              ::fidl::internal::OutgoingTransportContext());
  }
  ::fidl::unstable::UnownedEncodedMessage<
      ::fidl::internal::TransactionalResponse<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::
              ComposedCallWhichMayFail>,
      ::fidl::internal::ChannelTransport>
      _response_message(_allocation->data, _buffer_size, &_response);
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}
void fidl::internal::WireBufferCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    ReplySuccess(int64_t value) {
  ::test_errorsyntax_parent::wire::
      ParentUsesErrorSyntaxComposedCallWhichMayFailResponse _response =
          ::test_errorsyntax_parent::wire::
              ParentUsesErrorSyntaxComposedCallWhichMayFailResponse{
                  .value = std::move(value),
              };

  return Reply(
      ::test_errorsyntax_parent::wire::
          ParentUsesErrorSyntaxComposedCallWhichMayFailResult::WithResponse(
              ::fidl::ObjectView<
                  ::test_errorsyntax_parent::wire::
                      ParentUsesErrorSyntaxComposedCallWhichMayFailResponse>::
                  FromExternal(&_response)));
}

void fidl::internal::WireBufferCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    ReplyError(uint32_t error) {
  return Reply(::test_errorsyntax_parent::wire::
                   ParentUsesErrorSyntaxComposedCallWhichMayFailResult::WithErr(
                       std::move(error)));
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__
void fidl::internal::WireCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    Reply(
        ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResult
            result) {
  ::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>
      _response{result};
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalResponse<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>,
      ::fidl::internal::ChannelTransport>
      _response_message{::fidl::internal::AllowUnownedInputRef{}, &_response};
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}
void fidl::internal::WireCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    ReplySuccess(int64_t value) {
  ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResponse
      _response = ::test_errorsyntax::wire::
          ExampleUseOfErrorSyntaxCallWhichMayFailResponse{
              .value = std::move(value),
          };

  return Reply(
      ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResult::
          WithResponse(::fidl::ObjectView<
                       ::test_errorsyntax::wire::
                           ExampleUseOfErrorSyntaxCallWhichMayFailResponse>::
                           FromExternal(&_response)));
}

void fidl::internal::WireCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    ReplyError(uint32_t error) {
  return Reply(
      ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResult::
          WithErr(std::move(error)));
}

void fidl::internal::WireBufferCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    Reply(
        ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResult
            result) {
  ::fidl::internal::TransactionalResponse<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>
      _response{result};
  constexpr uint32_t _buffer_size = ::fidl::ServerReplyBufferSizeInChannel<
      ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>();
  ::fitx::result<::fidl::Error, ::fidl::BufferSpan> _allocation =
      _allocator().TryAllocate(_buffer_size);
  if (!_allocation.is_ok()) {
    ::fidl::OutgoingMessage _failure{_allocation.error_value()};
    return _core()->SendReply(&_failure,
                              ::fidl::internal::OutgoingTransportContext());
  }
  ::fidl::unstable::UnownedEncodedMessage<
      ::fidl::internal::TransactionalResponse<
          ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>,
      ::fidl::internal::ChannelTransport>
      _response_message(_allocation->data, _buffer_size, &_response);
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}
void fidl::internal::WireBufferCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    ReplySuccess(int64_t value) {
  ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResponse
      _response = ::test_errorsyntax::wire::
          ExampleUseOfErrorSyntaxCallWhichMayFailResponse{
              .value = std::move(value),
          };

  return Reply(
      ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResult::
          WithResponse(::fidl::ObjectView<
                       ::test_errorsyntax::wire::
                           ExampleUseOfErrorSyntaxCallWhichMayFailResponse>::
                           FromExternal(&_response)));
}

void fidl::internal::WireBufferCompleterImpl<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    ReplyError(uint32_t error) {
  return Reply(
      ::test_errorsyntax::wire::ExampleUseOfErrorSyntaxCallWhichMayFailResult::
          WithErr(std::move(error)));
}
#endif  // __Fuchsia__

void ::fidl::internal::TransactionalRequest<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    _InitHeader() {
  ::fidl::InitTxnHeader(
      &header, 0,
      ::test_errorsyntax::
          kExampleUseOfErrorSyntax_ComposedCallWhichMayFail_Ordinal,
      ::test_errorsyntax::
          kExampleUseOfErrorSyntax_ComposedCallWhichMayFail_DynamicFlags);
}

void ::fidl::internal::TransactionalResponse<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::ComposedCallWhichMayFail>::
    _InitHeader() {
  ::fidl::InitTxnHeader(
      &header, 0,
      ::test_errorsyntax::
          kExampleUseOfErrorSyntax_ComposedCallWhichMayFail_Ordinal,
      ::test_errorsyntax::
          kExampleUseOfErrorSyntax_ComposedCallWhichMayFail_DynamicFlags);
}

void ::fidl::internal::TransactionalRequest<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    _InitHeader() {
  ::fidl::InitTxnHeader(
      &header, 0,
      ::test_errorsyntax::kExampleUseOfErrorSyntax_CallWhichMayFail_Ordinal,
      ::test_errorsyntax::
          kExampleUseOfErrorSyntax_CallWhichMayFail_DynamicFlags);
}

void ::fidl::internal::TransactionalResponse<
    ::test_errorsyntax::ExampleUseOfErrorSyntax::CallWhichMayFail>::
    _InitHeader() {
  ::fidl::InitTxnHeader(
      &header, 0,
      ::test_errorsyntax::kExampleUseOfErrorSyntax_CallWhichMayFail_Ordinal,
      ::test_errorsyntax::
          kExampleUseOfErrorSyntax_CallWhichMayFail_DynamicFlags);
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
