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

#pragma once

#include <lib/fidl/llcpp/array.h>
#include <lib/fidl/llcpp/coding.h>
#include <lib/fidl/llcpp/envelope.h>
#include <lib/fidl/llcpp/message.h>
#include <lib/fidl/llcpp/message_storage.h>
#include <lib/fidl/llcpp/object_view.h>
#include <lib/fidl/llcpp/string_view.h>
#include <lib/fidl/llcpp/traits.h>
#include <lib/fidl/llcpp/wire_types.h>
#include <lib/stdcompat/optional.h>

#include <cinttypes>
#ifdef __Fuchsia__
#include <lib/zx/channel.h>

#endif  // __Fuchsia__

#include <fidl/test.unknowninteractions/cpp/common_types.h>
#include <fidl/test.unknowninteractions/cpp/markers.h>

namespace test_unknowninteractions {
namespace wire {
struct ExampleFlexibleTwoWayResponse;

struct ExampleFlexibleTwoWayTopResponse;

class ExampleFlexibleTwoWayResult;

extern "C" const fidl_type_t
    test_unknowninteractions_Example_FlexibleTwoWay_ResponseTable;

struct ExampleFlexibleTwoWayResponse {
  uint8_t __reserved = {};
};

extern "C" const fidl_type_t
    test_unknowninteractions_Example_FlexibleTwoWay_ResultTable;

class ExampleFlexibleTwoWayResult {
 public:
  using Response =
      test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse;

  ExampleFlexibleTwoWayResult()
      : ordinal_(::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult::
                     Ordinal::Invalid),
        envelope_{} {}

  ExampleFlexibleTwoWayResult(const ExampleFlexibleTwoWayResult&) = default;
  ExampleFlexibleTwoWayResult& operator=(const ExampleFlexibleTwoWayResult&) =
      default;
  ExampleFlexibleTwoWayResult(ExampleFlexibleTwoWayResult&&) = default;
  ExampleFlexibleTwoWayResult& operator=(ExampleFlexibleTwoWayResult&&) =
      default;

  enum class Tag : fidl_xunion_tag_t {
    kResponse = 1,      // 0x1
    kTransportErr = 3,  // 0x3
  };

  bool has_invalid_tag() const {
    return ordinal_ == ::test_unknowninteractions::wire::
                           ExampleFlexibleTwoWayResult::Ordinal::Invalid;
  }

  bool is_response() const {
    return ordinal_ == ::test_unknowninteractions::wire::
                           ExampleFlexibleTwoWayResult::Ordinal::kResponse;
  }

  static ExampleFlexibleTwoWayResult WithResponse(
      ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse val) {
    ExampleFlexibleTwoWayResult result;
    result.ordinal_ = ::test_unknowninteractions::wire::
        ExampleFlexibleTwoWayResult::Ordinal::kResponse;
    result.envelope_
        .As<::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse>()
        .set_data(std::move(val));
    return result;
  }

  ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse& response() {
    ZX_ASSERT(ordinal_ == ::test_unknowninteractions::wire::
                              ExampleFlexibleTwoWayResult::Ordinal::kResponse);
    return envelope_
        .As<::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse>()
        .get_data();
  }
  const ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse&
  response() const {
    ZX_ASSERT(ordinal_ == ::test_unknowninteractions::wire::
                              ExampleFlexibleTwoWayResult::Ordinal::kResponse);
    return envelope_
        .As<::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse>()
        .get_data();
  }

  bool is_transport_err() const {
    return ordinal_ == ::test_unknowninteractions::wire::
                           ExampleFlexibleTwoWayResult::Ordinal::kTransportErr;
  }

  static ExampleFlexibleTwoWayResult WithTransportErr(int32_t val) {
    ExampleFlexibleTwoWayResult result;
    result.ordinal_ = ::test_unknowninteractions::wire::
        ExampleFlexibleTwoWayResult::Ordinal::kTransportErr;
    result.envelope_.As<int32_t>().set_data(std::move(val));
    return result;
  }

  int32_t& transport_err() {
    ZX_ASSERT(ordinal_ ==
              ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult::
                  Ordinal::kTransportErr);
    return envelope_.As<int32_t>().get_data();
  }
  const int32_t& transport_err() const {
    ZX_ASSERT(ordinal_ ==
              ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult::
                  Ordinal::kTransportErr);
    return envelope_.As<int32_t>().get_data();
  }
  ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult::Tag Which()
      const {
    ZX_ASSERT(!has_invalid_tag());
    return static_cast<
        ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult::Tag>(
        ordinal_);
  }

 private:
  enum class Ordinal : fidl_xunion_tag_t {
    Invalid = 0,
    kResponse = 1,      // 0x1
    kTransportErr = 3,  // 0x3
  };

  static void SizeAndOffsetAssertionHelper();
  ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult::Ordinal
      ordinal_;
  FIDL_ALIGNDECL
  ::fidl::UntypedEnvelope envelope_;
};

extern "C" const fidl_type_t
    test_unknowninteractions_ExampleFlexibleTwoWayTopResponseTable;

struct ExampleFlexibleTwoWayTopResponse {
  using Result = test_unknowninteractions::wire::ExampleFlexibleTwoWayResult;

  ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult result = {};
};

}  // namespace wire
}  // namespace test_unknowninteractions
namespace fidl {

template <>
struct TypeTraits<
    ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse> {
  static constexpr const fidl_type_t* kType =
      &::test_unknowninteractions::wire::
          test_unknowninteractions_Example_FlexibleTwoWay_ResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kPrimarySizeV1 = 1;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<
    ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse>
    : public std::true_type {};
template <>
struct IsStruct<::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse>
    : public std::true_type {};
static_assert(std::is_standard_layout_v<
              ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse>);
static_assert(
    offsetof(::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse,
             __reserved) == 0);
static_assert(
    sizeof(::test_unknowninteractions::wire::ExampleFlexibleTwoWayResponse) ==
    TypeTraits<::test_unknowninteractions::wire::
                   ExampleFlexibleTwoWayResponse>::kPrimarySize);

template <>
struct TypeTraits<
    ::test_unknowninteractions::wire::ExampleFlexibleTwoWayTopResponse> {
  static constexpr const fidl_type_t* kType =
      &::test_unknowninteractions::wire::
          test_unknowninteractions_ExampleFlexibleTwoWayTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<
    ::test_unknowninteractions::wire::ExampleFlexibleTwoWayTopResponse>
    : public std::true_type {};
template <>
struct IsStruct<
    ::test_unknowninteractions::wire::ExampleFlexibleTwoWayTopResponse>
    : public std::true_type {};
static_assert(
    std::is_standard_layout_v<
        ::test_unknowninteractions::wire::ExampleFlexibleTwoWayTopResponse>);
static_assert(
    offsetof(::test_unknowninteractions::wire::ExampleFlexibleTwoWayTopResponse,
             result) == 0);
static_assert(
    sizeof(
        ::test_unknowninteractions::wire::ExampleFlexibleTwoWayTopResponse) ==
    TypeTraits<::test_unknowninteractions::wire::
                   ExampleFlexibleTwoWayTopResponse>::kPrimarySize);

template <>
struct TypeTraits<
    ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult> {
  static constexpr const fidl_type_t* kType =
      &::test_unknowninteractions::wire::
          test_unknowninteractions_Example_FlexibleTwoWay_ResultTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult>
    : public std::true_type {};
template <>
struct IsUnion<::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult>
    : public std::true_type {};
static_assert(std::is_standard_layout_v<
              ::test_unknowninteractions::wire::ExampleFlexibleTwoWayResult>);

}  // namespace fidl
