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

#include <fidl/test.unknowninteractions/cpp/natural_messaging.h>

namespace test_unknowninteractions {
[[maybe_unused]] constexpr inline uint64_t kExample_StrictOneWay_Ordinal =
    2276912608357927194lu;

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

[[maybe_unused]] constexpr inline uint64_t kExample_FlexibleOneWay_Ordinal =
    2309537410782500280lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kExample_FlexibleOneWay_DynamicFlags =
        ::fidl::MessageDynamicFlags::kFlexibleMethod;

[[maybe_unused]] constexpr inline uint64_t kExample_StrictTwoWay_Ordinal =
    4530909159434307973lu;

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

[[maybe_unused]] constexpr inline uint64_t kExample_FlexibleTwoWay_Ordinal =
    9070032238358100524lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kExample_FlexibleTwoWay_DynamicFlags =
        ::fidl::MessageDynamicFlags::kFlexibleMethod;

[[maybe_unused]] constexpr inline uint64_t kExample_StrictEvent_Ordinal =
    2942732192976592869lu;

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

[[maybe_unused]] constexpr inline uint64_t kExample_FlexibleEvent_Ordinal =
    2065245206460174394lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    kExample_FlexibleEvent_DynamicFlags =
        ::fidl::MessageDynamicFlags::kFlexibleMethod;

#ifdef __Fuchsia__
}  // namespace test_unknowninteractions
::fidl::internal::NaturalThenable<
    ::test_unknowninteractions::Example::StrictTwoWay>
fidl::internal::NaturalClientImpl<
    ::test_unknowninteractions::Example>::StrictTwoWay() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_StrictTwoWay_Ordinal,
      ::test_unknowninteractions::kExample_StrictTwoWay_DynamicFlags};
  return ::fidl::internal::NaturalThenable<
      ::test_unknowninteractions::Example::StrictTwoWay>(
      &client_base(), {}, std::move(_encoder),
      [](::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_unknowninteractions::Example::FlexibleTwoWay>
fidl::internal::NaturalClientImpl<
    ::test_unknowninteractions::Example>::FlexibleTwoWay() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_FlexibleTwoWay_Ordinal,
      ::test_unknowninteractions::kExample_FlexibleTwoWay_DynamicFlags};
  return ::fidl::internal::NaturalThenable<
      ::test_unknowninteractions::Example::FlexibleTwoWay>(
      &client_base(), {}, std::move(_encoder),
      [](::fidl::internal::ThenableBase* base,
         ::fidl::internal::NaturalMessageEncoder& encoder,
         ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

::fitx::result<::fidl::Error> fidl::internal::NaturalClientImpl<
    ::test_unknowninteractions::Example>::StrictOneWay() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_StrictOneWay_Ordinal,
      ::test_unknowninteractions::kExample_StrictOneWay_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::Status status = client_base().SendOneWay(_encoded_message);
  return ::fidl::internal::ToFitxResult(status);
}

::fitx::result<::fidl::Error> fidl::internal::NaturalClientImpl<
    ::test_unknowninteractions::Example>::FlexibleOneWay() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_FlexibleOneWay_Ordinal,
      ::test_unknowninteractions::kExample_FlexibleOneWay_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::Status status = client_base().SendOneWay(_encoded_message);
  return ::fidl::internal::ToFitxResult(status);
}
namespace test_unknowninteractions {
#endif  // __Fuchsia__

}  // namespace test_unknowninteractions
#ifdef __Fuchsia__

std::optional<::fidl::UnbindInfo> fidl::internal::
    NaturalEventDispatcher<::test_unknowninteractions::Example>::DispatchEvent(
        ::fidl::IncomingMessage& msg,
        ::fidl::internal::IncomingTransportContext transport_context) {
  switch (msg.header()->ordinal) {
    case ::test_unknowninteractions::kExample_StrictEvent_Ordinal: {
      ::fitx::result decoded =
          ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
      if (decoded.is_error()) {
        return ::fidl::UnbindInfo(decoded.error_value());
      }
      if (event_handler()) {
        ::fidl::Event<::test_unknowninteractions::Example::StrictEvent> event;
        event_handler()->StrictEvent(event);
      }
      return std::nullopt;
    }
    case ::test_unknowninteractions::kExample_FlexibleEvent_Ordinal: {
      ::fitx::result decoded =
          ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
      if (decoded.is_error()) {
        return ::fidl::UnbindInfo(decoded.error_value());
      }
      if (event_handler()) {
        ::fidl::Event<::test_unknowninteractions::Example::FlexibleEvent> event;
        event_handler()->FlexibleEvent(event);
      }
      return std::nullopt;
    }
    default:
      break;
  }
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

::fitx::result<::fidl::Error> fidl::internal::NaturalWeakEventSender<
    ::test_unknowninteractions::Example>::StrictEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_StrictEvent_Ordinal,
      ::test_unknowninteractions::kExample_StrictEvent_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::Status result = _inner().SendEvent(_encoded_message);
  return ::fidl::internal::ToFitxResult(result);
}

::fitx::result<::fidl::Error> fidl::internal::NaturalEventSender<
    ::test_unknowninteractions::Example>::StrictEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_StrictEvent_Ordinal,
      ::test_unknowninteractions::kExample_StrictEvent_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::Status{_encoded_message});
}

::fitx::result<::fidl::Error> fidl::internal::NaturalWeakEventSender<
    ::test_unknowninteractions::Example>::FlexibleEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_FlexibleEvent_Ordinal,
      ::test_unknowninteractions::kExample_FlexibleEvent_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::Status result = _inner().SendEvent(_encoded_message);
  return ::fidl::internal::ToFitxResult(result);
}

::fitx::result<::fidl::Error> fidl::internal::NaturalEventSender<
    ::test_unknowninteractions::Example>::FlexibleEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_FlexibleEvent_Ordinal,
      ::test_unknowninteractions::kExample_FlexibleEvent_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::Status{_encoded_message});
}

#endif  // __Fuchsia__

void fidl::internal::NaturalCompleterBase<
    ::test_unknowninteractions::Example::StrictTwoWay>::Reply() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_StrictTwoWay_Ordinal,
      ::test_unknowninteractions::kExample_StrictTwoWay_DynamicFlags};
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

void fidl::internal::NaturalCompleterBase<
    ::test_unknowninteractions::Example::FlexibleTwoWay>::
    Reply(
        ::fidl::Response<::test_unknowninteractions::Example::FlexibleTwoWay>&&
            response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_unknowninteractions::kExample_FlexibleTwoWay_Ordinal,
      ::test_unknowninteractions::kExample_FlexibleTwoWay_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Response<
          ::test_unknowninteractions::Example::FlexibleTwoWay>>::
          IntoDomainObject(std::move(response)));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<
    ::test_unknowninteractions::Example>::entries_[] = {
    {
        ::test_unknowninteractions::kExample_StrictOneWay_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded =
              ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<::test_unknowninteractions::Example::StrictOneWay>
              request;
          ::fidl::internal::NaturalCompleter<
              ::test_unknowninteractions::Example::StrictOneWay>::Sync
              completer(txn);
          static_cast<::fidl::Server<::test_unknowninteractions::Example>*>(
              interface)
              ->StrictOneWay(request, completer);
          return ZX_OK;
        },
    },
    {
        ::test_unknowninteractions::kExample_FlexibleOneWay_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded =
              ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<::test_unknowninteractions::Example::FlexibleOneWay>
              request;
          ::fidl::internal::NaturalCompleter<
              ::test_unknowninteractions::Example::FlexibleOneWay>::Sync
              completer(txn);
          static_cast<::fidl::Server<::test_unknowninteractions::Example>*>(
              interface)
              ->FlexibleOneWay(request, completer);
          return ZX_OK;
        },
    },
    {
        ::test_unknowninteractions::kExample_StrictTwoWay_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded =
              ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<::test_unknowninteractions::Example::StrictTwoWay>
              request;
          ::fidl::internal::NaturalCompleter<
              ::test_unknowninteractions::Example::StrictTwoWay>::Sync
              completer(txn);
          static_cast<::fidl::Server<::test_unknowninteractions::Example>*>(
              interface)
              ->StrictTwoWay(request, completer);
          return ZX_OK;
        },
    },
    {
        ::test_unknowninteractions::kExample_FlexibleTwoWay_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded =
              ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<::test_unknowninteractions::Example::FlexibleTwoWay>
              request;
          ::fidl::internal::NaturalCompleter<
              ::test_unknowninteractions::Example::FlexibleTwoWay>::Sync
              completer(txn);
          static_cast<::fidl::Server<::test_unknowninteractions::Example>*>(
              interface)
              ->FlexibleTwoWay(request, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<
    ::test_unknowninteractions::Example>::entries_end_ = &entries_[4];

void fidl::internal::
    NaturalServerDispatcher<::test_unknowninteractions::Example>::Dispatch(
        ::fidl::Server<::test_unknowninteractions::Example>* 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::Server<::test_unknowninteractions::Example>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::NaturalServerDispatcher<
      ::test_unknowninteractions::Example>::Dispatch(this, std::move(msg),
                                                     std::move(
                                                         transport_context),
                                                     txn);
}
#endif  // __Fuchsia__
