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

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

#include <memory>

namespace test_anonymous {
[[maybe_unused]] constexpr uint64_t kSomeProtocol_SomeMethod_Ordinal =
    2515914517457749720lu;

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

extern "C" const fidl_type_t test_anonymous_SomeProtocolSomeMethodRequestTable;

extern "C" const fidl_type_t
    test_anonymous_SomeProtocolSomeMethodTopResponseTable;
#ifdef __Fuchsia__
}  // namespace test_anonymous
::fidl::WireResult<::test_anonymous::SomeProtocol::SomeMethod>::WireResult(
    ::fidl::UnownedClientEnd<::test_anonymous::SomeProtocol> client,
    ::fidl::internal::TransactionalRequest<
        ::test_anonymous::SomeProtocol::SomeMethod>* request) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<
          ::test_anonymous::SomeProtocol::SomeMethod>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<::fidl::internal::TransactionalResponse<
      ::test_anonymous::SomeProtocol::SomeMethod>>(
      client.handle(), bytes_.data(), static_cast<uint32_t>(bytes_.size()));
  SetStatus(outgoing);
  if (ok()) {
    auto* raw_response = reinterpret_cast<
        ::fidl::WireResponse<::test_anonymous::SomeProtocol::SomeMethod>*>(
        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_anonymous::SomeProtocol::SomeMethod>::WireResult(
    ::fidl::UnownedClientEnd<::test_anonymous::SomeProtocol> client,
    ::fidl::internal::TransactionalRequest<
        ::test_anonymous::SomeProtocol::SomeMethod>* request,
    zx_time_t deadline) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<
          ::test_anonymous::SomeProtocol::SomeMethod>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<::fidl::internal::TransactionalResponse<
      ::test_anonymous::SomeProtocol::SomeMethod>>(
      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_anonymous::SomeProtocol::SomeMethod>*>(
        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_anonymous {
#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace test_anonymous
::fidl::WireUnownedResult<::test_anonymous::SomeProtocol::SomeMethod>::
    WireUnownedResult(
        ::fidl::UnownedClientEnd<::test_anonymous::SomeProtocol> client_end,
        ::fidl::internal::AnyBufferAllocator& allocator,
        ::fidl::internal::TransactionalRequest<
            ::test_anonymous::SomeProtocol::SomeMethod>* request) {
  constexpr uint32_t buffer_size = ::fidl::SyncClientMethodBufferSizeInChannel<
      ::test_anonymous::SomeProtocol::SomeMethod>();
  ::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_anonymous::SomeProtocol::SomeMethod>,
                               ::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_anonymous::SomeProtocol::SomeMethod>>
      request_message(request_bytes, request_byte_capacity, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<::fidl::internal::TransactionalResponse<
      ::test_anonymous::SomeProtocol::SomeMethod>>(
      client_end.handle(), response_bytes, response_byte_capacity);
  bytes_ = response_bytes;
  if (outgoing.ok()) {
    auto* raw_response = reinterpret_cast<
        ::fidl::WireResponse<::test_anonymous::SomeProtocol::SomeMethod>*>(
        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_anonymous {
#endif  // __Fuchsia__

}  // namespace test_anonymous
#ifdef __Fuchsia__

::fidl::internal::WireThenable<::test_anonymous::SomeProtocol::SomeMethod>
fidl::internal::WireWeakAsyncClientImpl<::test_anonymous::SomeProtocol>::
    SomeMethod(::test_anonymous::wire::UnionMember union_member,
               ::test_anonymous::wire::TableMember table_member) {
  ::fidl::internal::TransactionalRequest<
      ::test_anonymous::SomeProtocol::SomeMethod>
      _request{union_member, table_member};
  return ::fidl::internal::WireThenable<
      ::test_anonymous::SomeProtocol::SomeMethod>{
      _client_base(), ::fidl::WriteOptions{},
      ::fidl::internal::AllowUnownedInputRef{}, &_request};
}
::fidl::internal::WireBufferThenable<::test_anonymous::SomeProtocol::SomeMethod>
fidl::internal::WireWeakAsyncBufferClientImpl<::test_anonymous::SomeProtocol>::
    SomeMethod(::test_anonymous::wire::UnionMember union_member,
               ::test_anonymous::wire::TableMember table_member) {
  constexpr uint32_t _buffer_size =
      ::fidl::AsyncClientMethodBufferSizeInChannel<
          ::test_anonymous::SomeProtocol::SomeMethod>();
  ::fidl::internal::TransactionalRequest<
      ::test_anonymous::SomeProtocol::SomeMethod>
      _request{union_member, table_member};
  return ::fidl::internal::WireBufferThenable<
      ::test_anonymous::SomeProtocol::SomeMethod>{
      _client_base(), ::fidl::WriteOptions{}, _allocator(), _buffer_size,
      &_request};
}

::fidl::WireResult<::test_anonymous::SomeProtocol::SomeMethod> fidl::internal::
    WireWeakSyncClientImpl<::test_anonymous::SomeProtocol>::SomeMethod(
        ::test_anonymous::wire::UnionMember union_member,
        ::test_anonymous::wire::TableMember table_member) {
  return _client_base()->MakeSyncCallWith(
      [&](std::shared_ptr<::fidl::internal::AnyTransport> _transport) {
        ::fidl::internal::TransactionalRequest<
            ::test_anonymous::SomeProtocol::SomeMethod>
            _request{union_member, table_member};
        return ::fidl::WireResult<::test_anonymous::SomeProtocol::SomeMethod>(
            ::fidl::UnownedClientEnd<::test_anonymous::SomeProtocol>(
                _transport->get<::fidl::internal::ChannelTransport>()),
            &_request);
      });
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

::fidl::Status
fidl::WireSyncEventHandler<::test_anonymous::SomeProtocol>::HandleOneEvent(
    ::fidl::UnownedClientEnd<::test_anonymous::SomeProtocol> 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_anonymous::SomeProtocol>::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_anonymous::SomeProtocol>::entries_[] = {
    {
        ::test_anonymous::kSomeProtocol_SomeMethod_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fidl::unstable::DecodedMessage<
              ::fidl::internal::TransactionalRequest<
                  ::test_anonymous::SomeProtocol::SomeMethod>>
              decoded{std::move(msg)};
          if (unlikely(!decoded.ok())) {
            return decoded.status();
          }
          auto* primary = &decoded.PrimaryObject()->body;
          ::fidl::internal::WireCompleter<
              ::test_anonymous::SomeProtocol::SomeMethod>::Sync completer(txn);
          reinterpret_cast<::fidl::WireServer<::test_anonymous::SomeProtocol>*>(
              interface)
              ->SomeMethod(primary, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::WireServerDispatcher<
    ::test_anonymous::SomeProtocol>::entries_end_ = &entries_[1];

::fidl::DispatchResult fidl::internal::
    WireServerDispatcher<::test_anonymous::SomeProtocol>::TryDispatch(
        ::fidl::WireServer<::test_anonymous::SomeProtocol>* 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_anonymous::SomeProtocol>::
    Dispatch(::fidl::WireServer<::test_anonymous::SomeProtocol>* 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_anonymous::SomeProtocol>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::WireServerDispatcher<
      ::test_anonymous::SomeProtocol>::Dispatch(this, std::move(msg),
                                                std::move(transport_context),
                                                txn);
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__
void fidl::internal::
    WireCompleterImpl<::test_anonymous::SomeProtocol::SomeMethod>::Reply(
        ::test_anonymous::wire::SomeProtocolSomeMethodResult result) {
  ::fidl::internal::TransactionalResponse<
      ::test_anonymous::SomeProtocol::SomeMethod>
      _response{result};
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalResponse<
          ::test_anonymous::SomeProtocol::SomeMethod>,
      ::fidl::internal::ChannelTransport>
      _response_message{::fidl::internal::AllowUnownedInputRef{}, &_response};
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}
void fidl::internal::
    WireCompleterImpl<::test_anonymous::SomeProtocol::SomeMethod>::ReplySuccess(
        ::test_anonymous::wire::BitsMember bits_member) {
  ::test_anonymous::wire::SomeProtocolSomeMethodResponse _response =
      ::test_anonymous::wire::SomeProtocolSomeMethodResponse{
          .bits_member = std::move(bits_member),
      };

  return Reply(
      ::test_anonymous::wire::SomeProtocolSomeMethodResult::WithResponse(
          std::move(_response)));
}

void fidl::internal::
    WireCompleterImpl<::test_anonymous::SomeProtocol::SomeMethod>::ReplyError(
        ::test_anonymous::wire::SomeProtocolSomeMethodError error) {
  return Reply(::test_anonymous::wire::SomeProtocolSomeMethodResult::WithErr(
      std::move(error)));
}

void fidl::internal::
    WireBufferCompleterImpl<::test_anonymous::SomeProtocol::SomeMethod>::Reply(
        ::test_anonymous::wire::SomeProtocolSomeMethodResult result) {
  ::fidl::internal::TransactionalResponse<
      ::test_anonymous::SomeProtocol::SomeMethod>
      _response{result};
  constexpr uint32_t _buffer_size = ::fidl::ServerReplyBufferSizeInChannel<
      ::test_anonymous::SomeProtocol::SomeMethod>();
  ::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_anonymous::SomeProtocol::SomeMethod>,
      ::fidl::internal::ChannelTransport>
      _response_message(_allocation->data, _buffer_size, &_response);
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}
void fidl::internal::WireBufferCompleterImpl<
    ::test_anonymous::SomeProtocol::SomeMethod>::
    ReplySuccess(::test_anonymous::wire::BitsMember bits_member) {
  ::test_anonymous::wire::SomeProtocolSomeMethodResponse _response =
      ::test_anonymous::wire::SomeProtocolSomeMethodResponse{
          .bits_member = std::move(bits_member),
      };

  return Reply(
      ::test_anonymous::wire::SomeProtocolSomeMethodResult::WithResponse(
          std::move(_response)));
}

void fidl::internal::WireBufferCompleterImpl<
    ::test_anonymous::SomeProtocol::SomeMethod>::
    ReplyError(::test_anonymous::wire::SomeProtocolSomeMethodError error) {
  return Reply(::test_anonymous::wire::SomeProtocolSomeMethodResult::WithErr(
      std::move(error)));
}
#endif  // __Fuchsia__

void ::fidl::internal::TransactionalRequest<
    ::test_anonymous::SomeProtocol::SomeMethod>::_InitHeader() {
  ::fidl::InitTxnHeader(
      &header, 0, ::test_anonymous::kSomeProtocol_SomeMethod_Ordinal,
      ::test_anonymous::kSomeProtocol_SomeMethod_DynamicFlags);
}

void ::fidl::internal::TransactionalResponse<
    ::test_anonymous::SomeProtocol::SomeMethod>::_InitHeader() {
  ::fidl::InitTxnHeader(
      &header, 0, ::test_anonymous::kSomeProtocol_SomeMethod_Ordinal,
      ::test_anonymous::kSomeProtocol_SomeMethod_DynamicFlags);
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
