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

#pragma once

#include "lib/fidl/cpp/internal/header.h"

namespace test {
namespace error {

//
// Domain objects declarations
//

class Example_foo_Response;

class Example_foo_Result;

class ExampleFooTopResponse;

class ExampleFooRequest;

#ifdef __Fuchsia__

class Example;
using ExampleHandle = ::fidl::InterfaceHandle<Example>;
#endif  // __Fuchsia__

class Example_foo_Response final {
 public:
  static const fidl_type_t* FidlType;
  Example_foo_Response() = default;
  explicit Example_foo_Response(int64_t v) : y(std::move(v)) {}
  int64_t ResultValue_() { return std::move(y); }
  explicit Example_foo_Response(::std::tuple<int64_t> _value_tuple) {
    std::tie(y) = std::move(_value_tuple);
  }
  operator ::std::tuple<int64_t>() && {
    return std::make_tuple(std::move(y));
  }

  int64_t y{};

  static inline ::std::unique_ptr<Example_foo_Response> New() { return ::std::make_unique<Example_foo_Response>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Example_foo_Response* value, size_t _offset);
  zx_status_t Clone(Example_foo_Response* result) const;
};

inline zx_status_t Clone(const ::test::error::Example_foo_Response& _value,
                         ::test::error::Example_foo_Response* _result) {
  return _value.Clone(_result);
}

using Example_foo_ResponsePtr = ::std::unique_ptr<Example_foo_Response>;

class Example_foo_Result final {
 public:
  static const fidl_type_t* FidlType;

  Example_foo_Result();
  ~Example_foo_Result();

  Example_foo_Result(Example_foo_Result&&);
  Example_foo_Result& operator=(Example_foo_Result&&);

  static Example_foo_Result WithResponse(::test::error::Example_foo_Response&&);
  static Example_foo_Result WithErr(uint32_t&&);

  enum __attribute__((enum_extensibility(closed))) Tag : fidl_xunion_tag_t {

    kResponse = 1,  // 0x1
    kErr = 2,       // 0x2
    Invalid = ::std::numeric_limits<::fidl_union_tag_t>::max(),
  };

  static inline ::std::unique_ptr<Example_foo_Result> New() { return ::std::make_unique<Example_foo_Result>(); }

  void Encode(::fidl::Encoder* encoder, size_t offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Example_foo_Result* value, size_t offset);
  zx_status_t Clone(Example_foo_Result* result) const;

  bool has_invalid_tag() const {
    return tag_ == Invalid;
  }

  bool is_response() const { return tag_ == ::test::error::Example_foo_Result::Tag::kResponse; }

  ::test::error::Example_foo_Response& response() {
    EnsureStorageInitialized(::test::error::Example_foo_Result::Tag::kResponse);
    return response_;
  }

  const ::test::error::Example_foo_Response& response() const {
    ZX_ASSERT(is_response());
    return response_;
  }
  Example_foo_Result& set_response(::test::error::Example_foo_Response value);

  bool is_err() const { return tag_ == ::test::error::Example_foo_Result::Tag::kErr; }

  uint32_t& err() {
    EnsureStorageInitialized(::test::error::Example_foo_Result::Tag::kErr);
    return err_;
  }

  const uint32_t& err() const {
    ZX_ASSERT(is_err());
    return err_;
  }
  Example_foo_Result& set_err(uint32_t value);

  ::test::error::Example_foo_Result::Tag Which() const {
    return ::test::error::Example_foo_Result::Tag(tag_);
  }

  // You probably want to use Which() method instead of Ordinal(). Use Ordinal() only when you need
  // access to the raw integral ordinal value.
  fidl_xunion_tag_t Ordinal() const {
    return tag_;
  }

  friend ::fidl::Equality<::test::error::Example_foo_Result>;

  Example_foo_Result(fpromise::result<int64_t, uint32_t>&& result) {
    ZX_ASSERT(!result.is_pending());
    if (result.is_ok()) {
      set_response(::test::error::Example_foo_Response{result.take_value()});
    } else {
      set_err(result.take_error());
    }
  }
  Example_foo_Result(fpromise::ok_result<int64_t>&& result)
      : Example_foo_Result(fpromise::result<int64_t, uint32_t>(std::move(result))) {}
  Example_foo_Result(fpromise::error_result<uint32_t>&& result)
      : Example_foo_Result(fpromise::result<int64_t, uint32_t>(std::move(result))) {}
  operator fpromise::result<int64_t, uint32_t>() && {
    if (is_err()) {
      return fpromise::error(err());
    }
    ::std::tuple<int64_t> value_tuple = std::move(response());
    return fpromise::ok(std::move(std::get<0>(value_tuple)));
  }

 private:
  void Destroy();
  void EnsureStorageInitialized(::fidl_xunion_tag_t tag);

  ::fidl_xunion_tag_t tag_ = static_cast<fidl_xunion_tag_t>(::test::error::Example_foo_Result::Tag::Invalid);
  union {
    ::test::error::Example_foo_Response response_;
    uint32_t err_;
  };
};

inline zx_status_t Clone(const ::test::error::Example_foo_Result& value,
                         ::test::error::Example_foo_Result* result) {
  return value.Clone(result);
}

using Example_foo_ResultPtr = ::std::unique_ptr<Example_foo_Result>;

class ExampleFooTopResponse final {
 public:
  static const fidl_type_t* FidlType;

  ::test::error::Example_foo_Result result{};

  static inline ::std::unique_ptr<ExampleFooTopResponse> New() { return ::std::make_unique<ExampleFooTopResponse>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, ExampleFooTopResponse* value, size_t _offset);
  zx_status_t Clone(ExampleFooTopResponse* result) const;
};

inline zx_status_t Clone(const ::test::error::ExampleFooTopResponse& _value,
                         ::test::error::ExampleFooTopResponse* _result) {
  return _value.Clone(_result);
}

using ExampleFooTopResponsePtr = ::std::unique_ptr<ExampleFooTopResponse>;

class ExampleFooRequest final {
 public:
  static const fidl_type_t* FidlType;

  ::std::string s{};

  static inline ::std::unique_ptr<ExampleFooRequest> New() { return ::std::make_unique<ExampleFooRequest>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, ExampleFooRequest* value, size_t _offset);
  zx_status_t Clone(ExampleFooRequest* result) const;
};

inline zx_status_t Clone(const ::test::error::ExampleFooRequest& _value,
                         ::test::error::ExampleFooRequest* _result) {
  return _value.Clone(_result);
}

using ExampleFooRequestPtr = ::std::unique_ptr<ExampleFooRequest>;

#ifdef __Fuchsia__

namespace _internal {
__LOCAL extern "C" const fidl_type_t test_error_ExampleFooRequestTable;

}  // namespace _internal
class Example_RequestEncoder {
 public:
  static ::fidl::HLCPPOutgoingMessage foo(::fidl::MessageEncoder* _encoder, ::std::string* s) {
    fidl_trace(WillHLCPPEncode);
    _encoder->Alloc(16);
    ::fidl::Encode(_encoder, s, 0 + sizeof(fidl_message_header_t));

    fidl_trace(DidHLCPPEncode, &::test::error::_internal::test_error_ExampleFooRequestTable, _encoder->GetPtr<const char>(0), _encoder->CurrentLength(), _encoder->CurrentHandleCount());

    return _encoder->GetMessage();
  }
};
namespace _internal {
__LOCAL extern "C" const fidl_type_t test_error_ExampleFooTopResponseTable;

}  // namespace _internal
class Example_ResponseEncoder {
 public:
  static ::fidl::HLCPPOutgoingMessage foo(::fidl::MessageEncoder* _encoder, ::test::error::Example_foo_Result* result) {
    fidl_trace(WillHLCPPEncode);

    _encoder->Alloc(16);
    ::fidl::Encode(_encoder, result, 0 + sizeof(fidl_message_header_t));

    fidl_trace(DidHLCPPEncode, &::test::error::_internal::test_error_ExampleFooTopResponseTable, _encoder->GetPtr<const char>(0), _encoder->CurrentLength(), _encoder->CurrentHandleCount());

    return _encoder->GetMessage();
  }
};
#endif  // __Fuchsia__

}  // namespace error
}  // namespace test
namespace fidl {
template <>
struct CodingTraits<::test::error::Example_foo_Response>
    : public EncodableCodingTraits<::test::error::Example_foo_Response, 8> {};

template <>
struct IsMemcpyCompatible<::test::error::Example_foo_Response> : public internal::BoolConstant<
                                                                     !HasPadding<::test::error::Example_foo_Response>::value && IsMemcpyCompatible<int64_t>::value> {};

inline zx_status_t Clone(const ::test::error::Example_foo_Response& value,
                         ::test::error::Example_foo_Response* result) {
  return ::test::error::Clone(value, result);
}

template <>
struct Equality<::test::error::Example_foo_Response> {
  bool operator()(const ::test::error::Example_foo_Response& _lhs, const ::test::error::Example_foo_Response& _rhs) const {
    if (!::fidl::Equals(_lhs.y, _rhs.y)) {
      return false;
    }
    return true;
  }
};
template <>
struct IsFidlXUnion<::test::error::Example_foo_Result> : public std::true_type {};

template <>
struct CodingTraits<::test::error::Example_foo_Result>
    : public EncodableCodingTraits<::test::error::Example_foo_Result, 16> {};

template <>
struct CodingTraits<std::unique_ptr<::test::error::Example_foo_Result>> {
  static constexpr size_t inline_size_v2 = 16;

  static void Encode(Encoder* encoder, std::unique_ptr<::test::error::Example_foo_Result>* value, size_t offset,
                     cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt) {
    auto&& p_xunion = *value;
    if (p_xunion) {
      p_xunion->Encode(encoder, offset);
    }
  }

  static void Decode(Decoder* _decoder, std::unique_ptr<::test::error::Example_foo_Result>* value, size_t offset) {
    fidl_xunion_t* encoded = _decoder->GetPtr<fidl_xunion_t>(offset);
    if (encoded->tag == 0) {
      value->reset(nullptr);
      return;
    }

    value->reset(new ::test::error::Example_foo_Result);

    ::test::error::Example_foo_Result::Decode(_decoder, value->get(), offset);
  }
};

inline zx_status_t Clone(const ::test::error::Example_foo_Result& value,
                         ::test::error::Example_foo_Result* result) {
  return ::test::error::Clone(value, result);
}

template <>
struct Equality<::test::error::Example_foo_Result> {
  bool operator()(const ::test::error::Example_foo_Result& _lhs, const ::test::error::Example_foo_Result& _rhs) const {
    if (_lhs.Ordinal() != _rhs.Ordinal()) {
      return false;
    }

    switch (_lhs.Ordinal()) {
      case static_cast<fidl_xunion_tag_t>(::test::error::Example_foo_Result::Tag::Invalid):
        return true;
      case ::test::error::Example_foo_Result::Tag::kResponse:
        return ::fidl::Equals(_lhs.response_, _rhs.response_);
      case ::test::error::Example_foo_Result::Tag::kErr:
        return ::fidl::Equals(_lhs.err_, _rhs.err_);

      default:
        return false;
    }
  }
};
template <>
struct CodingTraits<::test::error::ExampleFooTopResponse>
    : public EncodableCodingTraits<::test::error::ExampleFooTopResponse, 16> {};

template <>
struct HasPadding<::test::error::ExampleFooTopResponse> : public std::true_type {};

template <>
struct IsMemcpyCompatible<::test::error::ExampleFooTopResponse> : public internal::BoolConstant<
                                                                      !HasPadding<::test::error::ExampleFooTopResponse>::value && IsMemcpyCompatible<::test::error::Example_foo_Result>::value> {};

inline zx_status_t Clone(const ::test::error::ExampleFooTopResponse& value,
                         ::test::error::ExampleFooTopResponse* result) {
  return ::test::error::Clone(value, result);
}

template <>
struct Equality<::test::error::ExampleFooTopResponse> {
  bool operator()(const ::test::error::ExampleFooTopResponse& _lhs, const ::test::error::ExampleFooTopResponse& _rhs) const {
    if (!::fidl::Equals(_lhs.result, _rhs.result)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::error::ExampleFooRequest>
    : public EncodableCodingTraits<::test::error::ExampleFooRequest, 16> {};

template <>
struct HasPadding<::test::error::ExampleFooRequest> : public std::true_type {};

template <>
struct IsMemcpyCompatible<::test::error::ExampleFooRequest> : public internal::BoolConstant<
                                                                  !HasPadding<::test::error::ExampleFooRequest>::value && IsMemcpyCompatible<::std::string>::value> {};

inline zx_status_t Clone(const ::test::error::ExampleFooRequest& value,
                         ::test::error::ExampleFooRequest* result) {
  return ::test::error::Clone(value, result);
}

template <>
struct Equality<::test::error::ExampleFooRequest> {
  bool operator()(const ::test::error::ExampleFooRequest& _lhs, const ::test::error::ExampleFooRequest& _rhs) const {
    if (!::fidl::Equals(_lhs.s, _rhs.s)) {
      return false;
    }
    return true;
  }
};

//
// Proxies and stubs declarations
//
}  // namespace fidl
namespace test {
namespace error {
#ifdef __Fuchsia__

using ExamplePtr = ::fidl::InterfacePtr<Example>;
class Example_Proxy;
class Example_Stub;
class Example_EventSender;
class Example_Sync;
using ExampleSyncPtr = ::fidl::SynchronousInterfacePtr<Example>;
class Example_SyncProxy;

namespace internal {
constexpr uint64_t kExample_foo_Ordinal = 0xf5f1179dc411e44lu;
constexpr ::fidl::MessageDynamicFlags kExample_foo_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;
}  // namespace internal
#endif  // __Fuchsia__

#ifdef __Fuchsia__

class Example {
 public:
  using Proxy_ = ::test::error::Example_Proxy;
  using Stub_ = ::test::error::Example_Stub;
  using EventSender_ = ::test::error::Example_EventSender;
  using Sync_ = ::test::error::Example_Sync;
  virtual ~Example();
  using fooCallback =
      fit::function<void(::test::error::Example_foo_Result)>;

  virtual void foo(::std::string s, fooCallback callback) = 0;
};

class Example_RequestDecoder {
 public:
  Example_RequestDecoder() = default;
  virtual ~Example_RequestDecoder() = default;
  static const fidl_type_t* GetType(uint64_t ordinal, bool* out_needs_response);
  virtual void foo(::std::string s) = 0;
};

class Example_ResponseDecoder {
 public:
  Example_ResponseDecoder() = default;
  virtual ~Example_ResponseDecoder() = default;
  static const fidl_type_t* GetType(uint64_t ordinal);
  virtual void foo(::test::error::Example_foo_Result result) = 0;
};

class Example_EventSender {
 public:
  virtual ~Example_EventSender();
};

class Example_Sync {
 public:
  using Proxy_ = ::test::error::Example_SyncProxy;
  virtual ~Example_Sync();
  virtual zx_status_t foo(::std::string s, ::test::error::Example_foo_Result* out_result) = 0;
};

class Example_Proxy final : public ::fidl::internal::Proxy, public Example {
 public:
  explicit Example_Proxy(::fidl::internal::ProxyController* controller);
  ~Example_Proxy() override;

  zx_status_t Dispatch_(::fidl::HLCPPIncomingMessage message) override;
  // cts-coverage-fidl-name:test.error/Example.foo
  void foo(::std::string s, fooCallback callback) override;

 private:
  Example_Proxy(const ::test::error::Example_Proxy&) = delete;
  Example_Proxy& operator=(const ::test::error::Example_Proxy&) = delete;

  ::fidl::internal::ProxyController* controller_;
};

class Example_Stub final : public ::fidl::internal::Stub, public ::test::error::Example_EventSender {
 public:
  typedef class ::test::error::Example Example_clazz;
  explicit Example_Stub(::test::error::Example_Stub::Example_clazz* impl);
  ~Example_Stub() override;

  zx_status_t Dispatch_(::fidl::HLCPPIncomingMessage message,
                        ::fidl::internal::PendingResponse response) override;

 private:
  ::test::error::Example_Stub::Example_clazz* impl_;
};

class Example_SyncProxy : public ::test::error::Example_Sync {
 public:
  explicit Example_SyncProxy(::zx::channel channel);
  ~Example_SyncProxy() override;
  // cts-coverage-fidl-name:test.error/Example.foo
  zx_status_t foo(::std::string s, ::test::error::Example_foo_Result* out_result) override;

 private:
  ::fidl::internal::SynchronousProxy proxy_;
  friend class ::fidl::SynchronousInterfacePtr<Example>;
};
#endif  // __Fuchsia__

}  // namespace error
}  // namespace test
