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

// fidl_experiment = output_index_json

#pragma once

#include <lib/fidl/cpp/wire/internal/transport.h>
#include <lib/fidl/cpp/wire/unknown_interactions.h>

namespace test_union {

class TestProtocol final {
  TestProtocol() = delete;

 public:
  using Transport = ::fidl::internal::ChannelTransport;

  static constexpr ::fidl::internal::Openness kOpenness = ::fidl::internal::Openness::kClosed;

  class StrictUnionHenceResponseMayBeStackAllocated final {
    StrictUnionHenceResponseMayBeStackAllocated() = delete;

   public:
    using Protocol = ::test_union::TestProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
  class FlexibleUnionHenceResponseMustBeHeapAllocated final {
    FlexibleUnionHenceResponseMustBeHeapAllocated() = delete;

   public:
    using Protocol = ::test_union::TestProtocol;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = false;
    static constexpr bool kHasServerToClient = true;
    static constexpr bool kHasServerToClientBody = true;

    static constexpr bool kHasNonEmptyUserFacingResponse = true;
    static constexpr bool kHasDomainError = false;
    static constexpr bool kHasFrameworkError = false;
  };
};

}  // namespace test_union
namespace fidl {

template <>
struct IsProtocol<::test_union::TestProtocol> : public std::true_type {};

}  // namespace fidl
