// 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_inheritancewithrecursivedecl {

class Parent final {
  Parent() = delete;

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

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

  class First final {
    First() = delete;

   public:
    using Protocol = ::test_inheritancewithrecursivedecl::Parent;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

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

class Child final {
  Child() = delete;

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

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

  class First final {
    First() = delete;

   public:
    using Protocol = ::test_inheritancewithrecursivedecl::Child;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

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

   public:
    using Protocol = ::test_inheritancewithrecursivedecl::Child;
    static constexpr bool kHasClientToServer = true;
    static constexpr bool kHasClientToServerBody = true;
    static constexpr bool kHasServerToClient = false;
    static constexpr bool kHasServerToClientBody = false;

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

}  // namespace test_inheritancewithrecursivedecl
namespace fidl {

template <>
struct IsProtocol<::test_inheritancewithrecursivedecl::Parent> : public std::true_type {};

template <>
struct IsProtocol<::test_inheritancewithrecursivedecl::Child> : public std::true_type {};

}  // namespace fidl
