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

// fidl_experiment = output_index_json

#include <fidl/test.requestflexibleenvelope/cpp/natural_messaging.h>
#include <lib/fidl/cpp/wire/unknown_interactions.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace test_requestflexibleenvelope {

[[maybe_unused]]
constexpr inline uint64_t kProtocol_RequestStrictResponseFlexible_Ordinal = 700529454616207123lu;

[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kProtocol_RequestStrictResponseFlexible_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;

[[maybe_unused]]
constexpr inline uint64_t kProtocol_RequestFlexibleResponseStrict_Ordinal = 5191655763393883319lu;

[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kProtocol_RequestFlexibleResponseStrict_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;

#ifdef __Fuchsia__
}  // namespace test_requestflexibleenvelope

::fidl::internal::NaturalThenable<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>
fidl::internal::NaturalClientImpl<::test_requestflexibleenvelope::Protocol>::RequestStrictResponseFlexible(const ::fidl::Request<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>& request) const {
  return ::fidl::internal::NaturalThenable<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_requestflexibleenvelope::kProtocol_RequestStrictResponseFlexible_Ordinal, ::test_requestflexibleenvelope::kProtocol_RequestStrictResponseFlexible_DynamicFlags,
      [request = request](NaturalMessageEncoder& encoder) mutable {
        encoder.EncodeBody(request);
        return ZX_OK;
      },
      [](
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

::fidl::internal::NaturalThenable<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>
fidl::internal::NaturalClientImpl<::test_requestflexibleenvelope::Protocol>::RequestFlexibleResponseStrict(const ::fidl::Request<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>& request) const {
  return ::fidl::internal::NaturalThenable<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_requestflexibleenvelope::kProtocol_RequestFlexibleResponseStrict_Ordinal, ::test_requestflexibleenvelope::kProtocol_RequestFlexibleResponseStrict_DynamicFlags,
      [request = request](NaturalMessageEncoder& encoder) mutable {
        encoder.EncodeBody(request);
        return ZX_OK;
      },
      [](
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

namespace test_requestflexibleenvelope {

#endif  // __Fuchsia__

}  // namespace test_requestflexibleenvelope

#ifdef __Fuchsia__

::fidl::Result<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>
fidl::internal::NaturalSyncClientImpl<::test_requestflexibleenvelope::Protocol>::RequestStrictResponseFlexible(const ::fidl::Request<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>& request) {
  ::fidl::internal::NaturalMessageEncoder encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_requestflexibleenvelope::kProtocol_RequestStrictResponseFlexible_Ordinal, ::test_requestflexibleenvelope::kProtocol_RequestStrictResponseFlexible_DynamicFlags};
  encoder.EncodeBody(request);
  ::fidl::OutgoingMessage msg = encoder.GetMessage();
  ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>> response_storage;
  return ::fidl::internal::DecodeResponseAndFoldError<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>(
      msg.Call(_client_end().handle(), response_storage.view()), nullptr);
}

::fidl::Result<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>
fidl::internal::NaturalSyncClientImpl<::test_requestflexibleenvelope::Protocol>::RequestFlexibleResponseStrict(const ::fidl::Request<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>& request) {
  ::fidl::internal::NaturalMessageEncoder encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_requestflexibleenvelope::kProtocol_RequestFlexibleResponseStrict_Ordinal, ::test_requestflexibleenvelope::kProtocol_RequestFlexibleResponseStrict_DynamicFlags};
  encoder.EncodeBody(request);
  ::fidl::OutgoingMessage msg = encoder.GetMessage();
  ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>> response_storage;
  return ::fidl::internal::DecodeResponseAndFoldError<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>(
      msg.Call(_client_end().handle(), response_storage.view()), nullptr);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

::fidl::Status fidl::SyncEventHandler<::test_requestflexibleenvelope::Protocol>::HandleOneEvent(
    ::fidl::UnownedClientEnd<::test_requestflexibleenvelope::Protocol> client_end) {
  ::fidl::internal::IncomingEventsStorage<::test_requestflexibleenvelope::Protocol> event_storage;
  fidl::internal::NaturalEventDispatcher<::test_requestflexibleenvelope::Protocol> dispatcher{this};
  return HandleOneEventImpl_(client_end.channel(), event_storage.view(), dispatcher);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__

void fidl::internal::NaturalCompleterBase<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>::Reply(const ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_requestflexibleenvelope::kProtocol_RequestStrictResponseFlexible_Ordinal, ::test_requestflexibleenvelope::kProtocol_RequestStrictResponseFlexible_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

void fidl::internal::NaturalCompleterBase<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>::Reply(const ::fidl::Response<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_requestflexibleenvelope::kProtocol_RequestFlexibleResponseStrict_Ordinal, ::test_requestflexibleenvelope::kProtocol_RequestFlexibleResponseStrict_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<::test_requestflexibleenvelope::Protocol>::entries_[] = {
    {
        ::test_requestflexibleenvelope::kProtocol_RequestStrictResponseFlexible_Ordinal,
        [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
           internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
          ::fit::result decoded = ::fidl::StandaloneDecode<::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleRequest>(
              std::move(msg), metadata);
          if (decoded.is_error()) {
            return decoded.error_value();
          }
          ::fidl::internal::NaturalCompleter<::test_requestflexibleenvelope::Protocol::RequestStrictResponseFlexible>::Sync completer(txn);
          static_cast<::fidl::Server<::test_requestflexibleenvelope::Protocol>*>(interface)->RequestStrictResponseFlexible(
              decoded.value(),
              completer);
          return ::fidl::Status::Ok();
        },
    },
    {
        ::test_requestflexibleenvelope::kProtocol_RequestFlexibleResponseStrict_Ordinal,
        [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
           internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
          ::fit::result decoded = ::fidl::StandaloneDecode<::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictRequest>(
              std::move(msg), metadata);
          if (decoded.is_error()) {
            return decoded.error_value();
          }
          ::fidl::internal::NaturalCompleter<::test_requestflexibleenvelope::Protocol::RequestFlexibleResponseStrict>::Sync completer(txn);
          static_cast<::fidl::Server<::test_requestflexibleenvelope::Protocol>*>(interface)->RequestFlexibleResponseStrict(
              decoded.value(),
              completer);
          return ::fidl::Status::Ok();
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<::test_requestflexibleenvelope::Protocol>::entries_end_ =
    &entries_[2];

void fidl::internal::NaturalServerDispatcher<::test_requestflexibleenvelope::Protocol>::Dispatch(::fidl::Server<::test_requestflexibleenvelope::Protocol>* impl, ::fidl::IncomingHeaderAndMessage&& msg,
                                                                                                 internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, storage_view, txn, entries_, entries_end_, &unknown_method_handler_entry_);
}

void fidl::Server<::test_requestflexibleenvelope::Protocol>::dispatch_message(
    ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::MessageStorageViewBase* storage_view) {
  ::fidl::internal::NaturalServerDispatcher<::test_requestflexibleenvelope::Protocol>::Dispatch(this, std::move(msg), storage_view, txn);
}

#endif  // __Fuchsia__

#pragma clang diagnostic pop
