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

#include <fidl/test/error/llcpp/fidl.h>

#include <memory>

namespace llcpp {

namespace fidl {
namespace test {
namespace error {

void ::llcpp::fidl::test::error::Example_foo_Result::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(Example_foo_Result) == sizeof(fidl_xunion_t));
  static_assert(offsetof(Example_foo_Result, ordinal_) ==
                offsetof(fidl_xunion_t, tag));
  static_assert(offsetof(Example_foo_Result, envelope_) ==
                offsetof(fidl_xunion_t, envelope));
}

namespace {

[[maybe_unused]] constexpr uint64_t kExample_foo_Ordinal =
    6333213382893778862lu;
extern "C" const fidl_type_t fidl_test_error_ExamplefooRequestTable;
extern "C" const fidl_type_t fidl_test_error_ExamplefooResponseTable;

}  // namespace
Example::ResultOf::foo::foo(zx_handle_t _client, const ::fidl::StringView& s) {
  fooRequest::OwnedEncodedMessage _request(zx_txid_t(0), s);
  _request.GetOutgoingMessage().Call<fooResponse>(
      _client, bytes_, fooResponse::PrimarySize + fooResponse::MaxOutOfLine);
  status_ = _request.status();
  error_ = _request.error();
}

Example::ResultOf::foo::foo(zx_handle_t _client, const ::fidl::StringView& s,
                            zx_time_t _deadline) {
  fooRequest::OwnedEncodedMessage _request(zx_txid_t(0), s);
  _request.GetOutgoingMessage().Call<fooResponse>(
      _client, bytes_, fooResponse::PrimarySize + fooResponse::MaxOutOfLine,
      _deadline);
  status_ = _request.status();
  error_ = _request.error();
}

Example::UnownedResultOf::foo::foo(zx_handle_t _client, uint8_t* _request_bytes,
                                   uint32_t _request_byte_capacity,
                                   const ::fidl::StringView& s,
                                   uint8_t* _response_bytes,
                                   uint32_t _response_byte_capacity)
    : bytes_(_response_bytes) {
  fooRequest::UnownedEncodedMessage _request(_request_bytes,
                                             _request_byte_capacity, 0, s);
  _request.GetOutgoingMessage().Call<fooResponse>(_client, _response_bytes,
                                                  _response_byte_capacity);
  status_ = _request.status();
  error_ = _request.error();
}

Example::ResultOf::foo Example::ClientImpl::foo_Sync(::fidl::StringView s) {
  if (auto _channel = ::fidl::internal::ClientBase::GetChannel()) {
    return ResultOf::foo(_channel->handle(), s);
  }
  return Example::ResultOf::foo(
      ::fidl::Result(ZX_ERR_CANCELED, ::fidl::kErrorChannelUnbound));
}

Example::UnownedResultOf::foo Example::ClientImpl::foo_Sync(
    ::fidl::BufferSpan _request_buffer, ::fidl::StringView s,
    ::fidl::BufferSpan _response_buffer) {
  if (auto _channel = ::fidl::internal::ClientBase::GetChannel()) {
    return UnownedResultOf::foo(
        _channel->handle(), _request_buffer.data, _request_buffer.capacity, s,
        _response_buffer.data, _response_buffer.capacity);
  }
  return Example::UnownedResultOf::foo(
      ::fidl::Result(ZX_ERR_CANCELED, ::fidl::kErrorChannelUnbound));
}

Example::fooResponseContext::fooResponseContext()
    : ::fidl::internal::ResponseContext(fooResponse::Type,
                                        kExample_foo_Ordinal) {}

void Example::fooResponseContext::OnReply(uint8_t* reply) {
  OnReply(reinterpret_cast<fooResponse*>(reply));
}

::fidl::Result Example::ClientImpl::foo(
    ::fidl::StringView s, ::fit::callback<void(fooResponse* response)> _cb) {
  class ResponseContext final : public fooResponseContext {
   public:
    ResponseContext(::fit::callback<void(fooResponse* response)> cb)
        : cb_(std::move(cb)) {}

    void OnReply(fooResponse* response) override {
      cb_(response);

      delete this;
    }

    void OnError() override { delete this; }

   private:
    ::fit::callback<void(fooResponse* response)> cb_;
  };

  auto* _context = new ResponseContext(std::move(_cb));
  ::fidl::internal::ClientBase::PrepareAsyncTxn(_context);
  fooRequest::OwnedEncodedMessage _request(_context->Txid(), s);
  return _request.GetOutgoingMessage().Write(this, _context);
}

::fidl::Result Example::ClientImpl::foo(::fidl::BufferSpan _request_buffer,
                                        ::fidl::StringView s,
                                        fooResponseContext* _context) {
  ::fidl::internal::ClientBase::PrepareAsyncTxn(_context);

  fooRequest::UnownedEncodedMessage _request(
      _request_buffer.data, _request_buffer.capacity, _context->Txid(), s);
  return _request.GetOutgoingMessage().Write(this, _context);
}

std::optional<::fidl::UnbindInfo> Example::ClientImpl::DispatchEvent(
    fidl_incoming_msg_t* msg) {
  fidl_message_header_t* hdr =
      reinterpret_cast<fidl_message_header_t*>(msg->bytes);
  switch (hdr->ordinal) {
    default:
      FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
      return ::fidl::UnbindInfo{::fidl::UnbindInfo::kUnexpectedMessage,
                                ZX_ERR_NOT_SUPPORTED};
  }
  return {};
}

namespace methods {

void ExampleDispatchfoo(void* interface, void* bytes,
                        ::fidl::Transaction* txn) {
  auto message = reinterpret_cast<Example::fooRequest*>(bytes);
  Example::Interface::fooCompleter::Sync completer(txn);
  reinterpret_cast<Example::Interface*>(interface)->foo(std::move(message->s),
                                                        completer);
}

}  // namespace methods

namespace entries {

::fidl::internal::MethodEntry Example[] = {
    {kExample_foo_Ordinal, Example::fooRequest::Type,
     methods::ExampleDispatchfoo},
};

}  // namespace entries

::fidl::DispatchResult Example::TryDispatch(Interface* impl,
                                            fidl_incoming_msg_t* msg,
                                            ::fidl::Transaction* txn) {
  return ::fidl::internal::TryDispatch(
      impl, msg, txn, entries::Example,
      entries::Example +
          sizeof(entries::Example) / sizeof(::fidl::internal::MethodEntry));
}

::fidl::DispatchResult Example::Dispatch(Interface* impl,
                                         fidl_incoming_msg_t* msg,
                                         ::fidl::Transaction* txn) {
  ::fidl::DispatchResult dispatch_result = TryDispatch(impl, msg, txn);
  if (dispatch_result == ::fidl::DispatchResult::kNotFound) {
    FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
    txn->InternalError(
        {::fidl::UnbindInfo::kUnexpectedMessage, ZX_ERR_NOT_SUPPORTED});
  }
  return dispatch_result;
}

::fidl::DispatchResult Example::Interface::dispatch_message(
    fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  return Example::Dispatch(this, msg, txn);
}

::fidl::Result Example::Interface::fooCompleterBase::Reply(
    ::llcpp::fidl::test::error::Example_foo_Result result) {
  fooResponse::OwnedEncodedMessage _response{result};
  return CompleterBase::SendReply(&_response.GetOutgoingMessage());
}
::fidl::Result Example::Interface::fooCompleterBase::ReplySuccess(int64_t y) {
  ::fidl::aligned<Example_foo_Response> _response;
  _response.value.y = std::move(y);

  return Reply(
      Example_foo_Result::WithResponse(::fidl::unowned_ptr(&_response)));
}
::fidl::Result Example::Interface::fooCompleterBase::ReplyError(
    uint32_t error) {
  return Reply(Example_foo_Result::WithErr(::fidl::unowned_ptr(&error)));
}

::fidl::Result Example::Interface::fooCompleterBase::Reply(
    ::fidl::BufferSpan _buffer,
    ::llcpp::fidl::test::error::Example_foo_Result result) {
  fooResponse::UnownedEncodedMessage _response(_buffer.data, _buffer.capacity,
                                               result);
  return CompleterBase::SendReply(&_response.GetOutgoingMessage());
}
::fidl::Result Example::Interface::fooCompleterBase::ReplySuccess(
    ::fidl::BufferSpan _buffer, int64_t y) {
  ::fidl::aligned<Example_foo_Response> response;
  response.value.y = std::move(y);

  return Reply(std::move(_buffer), Example_foo_Result::WithResponse(
                                       ::fidl::unowned_ptr(&response)));
}

void Example::fooRequest::_InitHeader(zx_txid_t _txid) {
  fidl_init_txn_header(&_hdr, _txid, kExample_foo_Ordinal);
}

void Example::fooResponse::_InitHeader() {
  fidl_init_txn_header(&_hdr, 0, kExample_foo_Ordinal);
}

}  // namespace error
}  // namespace test
}  // namespace fidl
}  // namespace llcpp
