#include <fidl/test.driveroneway/cpp/driver/natural_messaging.h>
#include <lib/fidl_driver/cpp/unknown_interactions.h>

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

namespace test_driveroneway {

[[maybe_unused]]
constexpr inline uint64_t kOneWay_Send_Ordinal = 7942965975761529343lu;

[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kOneWay_Send_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;
#ifdef __Fuchsia__
}  // namespace test_driveroneway

::fit::result<::fidl::OneWayError>
fidl::internal::NaturalClientImpl<::test_driveroneway::OneWay>::Send(const ::fidl::Request<::test_driveroneway::OneWay::Send>& request) const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::DriverTransport::VTable, ::test_driveroneway::kOneWay_Send_Ordinal, ::test_driveroneway::kOneWay_Send_DynamicFlags};

  fdf::Arena _arena('FIDL');

  ::fidl::WriteOptions _options = {
      .outgoing_transport_context =
          ::fidl::internal::OutgoingTransportContext::Create<::fidl::internal::DriverTransport>(_arena.get()),
  };
  _encoder.EncodeBody(request);
  ::fidl::OutgoingMessage _msg = _encoder.GetMessage();
  ::fidl::OutgoingMessage _arena_msg = ::fdf::internal::MoveToArena(_msg, _arena);
  ::fidl::OneWayStatus status = client_base().SendOneWay(_arena_msg, std::move(_options));
  return ::fidl::internal::ToFitxResult(status);
}
namespace test_driveroneway {

#endif  // __Fuchsia__
}  // namespace test_driveroneway

#ifdef __Fuchsia__

#endif  // __Fuchsia__

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<::test_driveroneway::OneWay>::entries_[] = {
    {
        ::test_driveroneway::kOneWay_Send_Ordinal,
        [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
           internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
          ::fit::result decoded = ::fidl::StandaloneDecode<::test_driveroneway::OneWaySendRequest>(
              std::move(msg), metadata);
          if (decoded.is_error()) {
            return decoded.error_value();
          }
          ::fidl::internal::NaturalCompleter<::test_driveroneway::OneWay::Send>::Sync completer(txn);
          static_cast<::fdf::Server<::test_driveroneway::OneWay>*>(interface)->Send(
              decoded.value(),
              completer);
          return ::fidl::Status::Ok();
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<::test_driveroneway::OneWay>::entries_end_ =
    &entries_[1];

void fidl::internal::NaturalServerDispatcher<::test_driveroneway::OneWay>::Dispatch(::fdf::Server<::test_driveroneway::OneWay>* 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 fdf::Server<::test_driveroneway::OneWay>::dispatch_message(
    ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::MessageStorageViewBase* storage_view) {
  ::fidl::internal::NaturalServerDispatcher<::test_driveroneway::OneWay>::Dispatch(this, std::move(msg), storage_view, txn);
}

#endif  // __Fuchsia__

#pragma clang diagnostic pop
