// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Autogenerated from Pigeon (v4.2.12), do not edit directly.
// See also: https://pub.dev/packages/pigeon

#ifndef PIGEON_CORE_TESTS_GEN_CORE_TESTS_PIGEONTEST_H_
#define PIGEON_CORE_TESTS_GEN_CORE_TESTS_PIGEONTEST_H_
#include <flutter/basic_message_channel.h>
#include <flutter/binary_messenger.h>
#include <flutter/encodable_value.h>
#include <flutter/standard_message_codec.h>

#include <map>
#include <optional>
#include <string>

namespace core_tests_pigeontest {
class CoreTestsTest;

// Generated class from Pigeon.

enum class AnEnum { one = 0, two = 1, three = 2 };

class FlutterError {
 public:
  explicit FlutterError(const std::string& code) : code_(code) {}
  explicit FlutterError(const std::string& code, const std::string& message)
      : code_(code), message_(message) {}
  explicit FlutterError(const std::string& code, const std::string& message,
                        const flutter::EncodableValue& details)
      : code_(code), message_(message), details_(details) {}

  const std::string& code() const { return code_; }
  const std::string& message() const { return message_; }
  const flutter::EncodableValue& details() const { return details_; }

 private:
  std::string code_;
  std::string message_;
  flutter::EncodableValue details_;
};

template <class T>
class ErrorOr {
 public:
  ErrorOr(const T& rhs) { new (&v_) T(rhs); }
  ErrorOr(const T&& rhs) { v_ = std::move(rhs); }
  ErrorOr(const FlutterError& rhs) { new (&v_) FlutterError(rhs); }
  ErrorOr(const FlutterError&& rhs) { v_ = std::move(rhs); }

  bool has_error() const { return std::holds_alternative<FlutterError>(v_); }
  const T& value() const { return std::get<T>(v_); };
  const FlutterError& error() const { return std::get<FlutterError>(v_); };

 private:
  friend class HostIntegrationCoreApi;
  friend class FlutterIntegrationCoreApi;
  friend class HostTrivialApi;
  ErrorOr() = default;
  T TakeValue() && { return std::get<T>(std::move(v_)); }

  std::variant<T, FlutterError> v_;
};

// Generated class from Pigeon that represents data sent in messages.
class AllTypes {
 public:
  AllTypes();
  bool a_bool() const;
  void set_a_bool(bool value_arg);

  int64_t an_int() const;
  void set_an_int(int64_t value_arg);

  double a_double() const;
  void set_a_double(double value_arg);

  const std::string& a_string() const;
  void set_a_string(std::string_view value_arg);

  const std::vector<uint8_t>& a_byte_array() const;
  void set_a_byte_array(const std::vector<uint8_t>& value_arg);

  const std::vector<int32_t>& a4_byte_array() const;
  void set_a4_byte_array(const std::vector<int32_t>& value_arg);

  const std::vector<int64_t>& a8_byte_array() const;
  void set_a8_byte_array(const std::vector<int64_t>& value_arg);

  const std::vector<double>& a_float_array() const;
  void set_a_float_array(const std::vector<double>& value_arg);

  const flutter::EncodableList& a_list() const;
  void set_a_list(const flutter::EncodableList& value_arg);

  const flutter::EncodableMap& a_map() const;
  void set_a_map(const flutter::EncodableMap& value_arg);

  const AnEnum& an_enum() const;
  void set_an_enum(const AnEnum& value_arg);

 private:
  AllTypes(const flutter::EncodableList& list);
  flutter::EncodableList ToEncodableList() const;
  friend class HostIntegrationCoreApi;
  friend class HostIntegrationCoreApiCodecSerializer;
  friend class FlutterIntegrationCoreApi;
  friend class FlutterIntegrationCoreApiCodecSerializer;
  friend class HostTrivialApi;
  friend class HostTrivialApiCodecSerializer;
  friend class CoreTestsTest;
  bool a_bool_;
  int64_t an_int_;
  double a_double_;
  std::string a_string_;
  std::vector<uint8_t> a_byte_array_;
  std::vector<int32_t> a4_byte_array_;
  std::vector<int64_t> a8_byte_array_;
  std::vector<double> a_float_array_;
  flutter::EncodableList a_list_;
  flutter::EncodableMap a_map_;
  AnEnum an_enum_;
};

// Generated class from Pigeon that represents data sent in messages.
class AllNullableTypes {
 public:
  AllNullableTypes();
  const bool* a_nullable_bool() const;
  void set_a_nullable_bool(const bool* value_arg);
  void set_a_nullable_bool(bool value_arg);

  const int64_t* a_nullable_int() const;
  void set_a_nullable_int(const int64_t* value_arg);
  void set_a_nullable_int(int64_t value_arg);

  const double* a_nullable_double() const;
  void set_a_nullable_double(const double* value_arg);
  void set_a_nullable_double(double value_arg);

  const std::string* a_nullable_string() const;
  void set_a_nullable_string(const std::string_view* value_arg);
  void set_a_nullable_string(std::string_view value_arg);

  const std::vector<uint8_t>* a_nullable_byte_array() const;
  void set_a_nullable_byte_array(const std::vector<uint8_t>* value_arg);
  void set_a_nullable_byte_array(const std::vector<uint8_t>& value_arg);

  const std::vector<int32_t>* a_nullable4_byte_array() const;
  void set_a_nullable4_byte_array(const std::vector<int32_t>* value_arg);
  void set_a_nullable4_byte_array(const std::vector<int32_t>& value_arg);

  const std::vector<int64_t>* a_nullable8_byte_array() const;
  void set_a_nullable8_byte_array(const std::vector<int64_t>* value_arg);
  void set_a_nullable8_byte_array(const std::vector<int64_t>& value_arg);

  const std::vector<double>* a_nullable_float_array() const;
  void set_a_nullable_float_array(const std::vector<double>* value_arg);
  void set_a_nullable_float_array(const std::vector<double>& value_arg);

  const flutter::EncodableList* a_nullable_list() const;
  void set_a_nullable_list(const flutter::EncodableList* value_arg);
  void set_a_nullable_list(const flutter::EncodableList& value_arg);

  const flutter::EncodableMap* a_nullable_map() const;
  void set_a_nullable_map(const flutter::EncodableMap* value_arg);
  void set_a_nullable_map(const flutter::EncodableMap& value_arg);

  const flutter::EncodableList* nullable_nested_list() const;
  void set_nullable_nested_list(const flutter::EncodableList* value_arg);
  void set_nullable_nested_list(const flutter::EncodableList& value_arg);

  const flutter::EncodableMap* nullable_map_with_annotations() const;
  void set_nullable_map_with_annotations(
      const flutter::EncodableMap* value_arg);
  void set_nullable_map_with_annotations(
      const flutter::EncodableMap& value_arg);

  const flutter::EncodableMap* nullable_map_with_object() const;
  void set_nullable_map_with_object(const flutter::EncodableMap* value_arg);
  void set_nullable_map_with_object(const flutter::EncodableMap& value_arg);

  const AnEnum* a_nullable_enum() const;
  void set_a_nullable_enum(const AnEnum* value_arg);
  void set_a_nullable_enum(const AnEnum& value_arg);

 private:
  AllNullableTypes(const flutter::EncodableList& list);
  flutter::EncodableList ToEncodableList() const;
  friend class AllNullableTypesWrapper;
  friend class HostIntegrationCoreApi;
  friend class HostIntegrationCoreApiCodecSerializer;
  friend class FlutterIntegrationCoreApi;
  friend class FlutterIntegrationCoreApiCodecSerializer;
  friend class HostTrivialApi;
  friend class HostTrivialApiCodecSerializer;
  friend class CoreTestsTest;
  std::optional<bool> a_nullable_bool_;
  std::optional<int64_t> a_nullable_int_;
  std::optional<double> a_nullable_double_;
  std::optional<std::string> a_nullable_string_;
  std::optional<std::vector<uint8_t>> a_nullable_byte_array_;
  std::optional<std::vector<int32_t>> a_nullable4_byte_array_;
  std::optional<std::vector<int64_t>> a_nullable8_byte_array_;
  std::optional<std::vector<double>> a_nullable_float_array_;
  std::optional<flutter::EncodableList> a_nullable_list_;
  std::optional<flutter::EncodableMap> a_nullable_map_;
  std::optional<flutter::EncodableList> nullable_nested_list_;
  std::optional<flutter::EncodableMap> nullable_map_with_annotations_;
  std::optional<flutter::EncodableMap> nullable_map_with_object_;
  std::optional<AnEnum> a_nullable_enum_;
};

// Generated class from Pigeon that represents data sent in messages.
class AllNullableTypesWrapper {
 public:
  AllNullableTypesWrapper();
  const AllNullableTypes& values() const;
  void set_values(const AllNullableTypes& value_arg);

 private:
  AllNullableTypesWrapper(const flutter::EncodableList& list);
  flutter::EncodableList ToEncodableList() const;
  friend class HostIntegrationCoreApi;
  friend class HostIntegrationCoreApiCodecSerializer;
  friend class FlutterIntegrationCoreApi;
  friend class FlutterIntegrationCoreApiCodecSerializer;
  friend class HostTrivialApi;
  friend class HostTrivialApiCodecSerializer;
  friend class CoreTestsTest;
  AllNullableTypes values_;
};

class HostIntegrationCoreApiCodecSerializer
    : public flutter::StandardCodecSerializer {
 public:
  inline static HostIntegrationCoreApiCodecSerializer& GetInstance() {
    static HostIntegrationCoreApiCodecSerializer sInstance;
    return sInstance;
  }

  HostIntegrationCoreApiCodecSerializer();

 public:
  void WriteValue(const flutter::EncodableValue& value,
                  flutter::ByteStreamWriter* stream) const override;

 protected:
  flutter::EncodableValue ReadValueOfType(
      uint8_t type, flutter::ByteStreamReader* stream) const override;
};

// The core interface that each host language plugin must implement in
// platform_test integration tests.
//
// Generated interface from Pigeon that represents a handler of messages from
// Flutter.
class HostIntegrationCoreApi {
 public:
  HostIntegrationCoreApi(const HostIntegrationCoreApi&) = delete;
  HostIntegrationCoreApi& operator=(const HostIntegrationCoreApi&) = delete;
  virtual ~HostIntegrationCoreApi(){};
  // A no-op function taking no arguments and returning no value, to sanity
  // test basic calling.
  virtual std::optional<FlutterError> Noop() = 0;
  // Returns the passed object, to test serialization and deserialization.
  virtual ErrorOr<AllTypes> EchoAllTypes(const AllTypes& everything) = 0;
  // Returns the passed object, to test serialization and deserialization.
  virtual ErrorOr<std::optional<AllNullableTypes>> EchoAllNullableTypes(
      const AllNullableTypes* everything) = 0;
  // Returns an error, to test error handling.
  virtual std::optional<FlutterError> ThrowError() = 0;
  // Returns passed in int.
  virtual ErrorOr<int64_t> EchoInt(int64_t an_int) = 0;
  // Returns passed in double.
  virtual ErrorOr<double> EchoDouble(double a_double) = 0;
  // Returns the passed in boolean.
  virtual ErrorOr<bool> EchoBool(bool a_bool) = 0;
  // Returns the passed in string.
  virtual ErrorOr<std::string> EchoString(const std::string& a_string) = 0;
  // Returns the passed in Uint8List.
  virtual ErrorOr<std::vector<uint8_t>> EchoUint8List(
      const std::vector<uint8_t>& a_uint8_list) = 0;
  // Returns the inner `aString` value from the wrapped object, to test
  // sending of nested objects.
  virtual ErrorOr<std::optional<std::string>> ExtractNestedNullableString(
      const AllNullableTypesWrapper& wrapper) = 0;
  // Returns the inner `aString` value from the wrapped object, to test
  // sending of nested objects.
  virtual ErrorOr<AllNullableTypesWrapper> CreateNestedNullableString(
      const std::string* nullable_string) = 0;
  // Returns passed in arguments of multiple types.
  virtual ErrorOr<AllNullableTypes> SendMultipleNullableTypes(
      const bool* a_nullable_bool, const int64_t* a_nullable_int,
      const std::string* a_nullable_string) = 0;
  // Returns passed in int.
  virtual ErrorOr<std::optional<int64_t>> EchoNullableInt(
      const int64_t* a_nullable_int) = 0;
  // Returns passed in double.
  virtual ErrorOr<std::optional<double>> EchoNullableDouble(
      const double* a_nullable_double) = 0;
  // Returns the passed in boolean.
  virtual ErrorOr<std::optional<bool>> EchoNullableBool(
      const bool* a_nullable_bool) = 0;
  // Returns the passed in string.
  virtual ErrorOr<std::optional<std::string>> EchoNullableString(
      const std::string* a_nullable_string) = 0;
  // Returns the passed in Uint8List.
  virtual ErrorOr<std::optional<std::vector<uint8_t>>> EchoNullableUint8List(
      const std::vector<uint8_t>* a_nullable_uint8_list) = 0;
  // A no-op function taking no arguments and returning no value, to sanity
  // test basic asynchronous calling.
  virtual void NoopAsync(
      std::function<void(std::optional<FlutterError> reply)> result) = 0;
  // Returns the passed string asynchronously.
  virtual void EchoAsyncString(
      const std::string& a_string,
      std::function<void(ErrorOr<std::string> reply)> result) = 0;
  virtual void CallFlutterNoop(
      std::function<void(std::optional<FlutterError> reply)> result) = 0;
  virtual void CallFlutterEchoString(
      const std::string& a_string,
      std::function<void(ErrorOr<std::string> reply)> result) = 0;

  // The codec used by HostIntegrationCoreApi.
  static const flutter::StandardMessageCodec& GetCodec();
  // Sets up an instance of `HostIntegrationCoreApi` to handle messages through
  // the `binary_messenger`.
  static void SetUp(flutter::BinaryMessenger* binary_messenger,
                    HostIntegrationCoreApi* api);
  static flutter::EncodableList WrapError(std::string_view error_message);
  static flutter::EncodableList WrapError(const FlutterError& error);

 protected:
  HostIntegrationCoreApi() = default;
};
class FlutterIntegrationCoreApiCodecSerializer
    : public flutter::StandardCodecSerializer {
 public:
  inline static FlutterIntegrationCoreApiCodecSerializer& GetInstance() {
    static FlutterIntegrationCoreApiCodecSerializer sInstance;
    return sInstance;
  }

  FlutterIntegrationCoreApiCodecSerializer();

 public:
  void WriteValue(const flutter::EncodableValue& value,
                  flutter::ByteStreamWriter* stream) const override;

 protected:
  flutter::EncodableValue ReadValueOfType(
      uint8_t type, flutter::ByteStreamReader* stream) const override;
};

// The core interface that the Dart platform_test code implements for host
// integration tests to call into.
//
// Generated class from Pigeon that represents Flutter messages that can be
// called from C++.
class FlutterIntegrationCoreApi {
 private:
  flutter::BinaryMessenger* binary_messenger_;

 public:
  FlutterIntegrationCoreApi(flutter::BinaryMessenger* binary_messenger);
  static const flutter::StandardMessageCodec& GetCodec();
  // A no-op function taking no arguments and returning no value, to sanity
  // test basic calling.
  void noop(std::function<void(void)>&& callback);
  // Returns the passed object, to test serialization and deserialization.
  void echoAllTypes(const AllTypes& everything_arg,
                    std::function<void(const AllTypes&)>&& callback);
  // Returns the passed object, to test serialization and deserialization.
  void echoAllNullableTypes(
      const AllNullableTypes& everything_arg,
      std::function<void(const AllNullableTypes&)>&& callback);
  // Returns the passed string, to test serialization and deserialization.
  void echoString(const std::string& a_string_arg,
                  std::function<void(const std::string&)>&& callback);
};

// An API that can be implemented for minimal, compile-only tests.
//
// Generated interface from Pigeon that represents a handler of messages from
// Flutter.
class HostTrivialApi {
 public:
  HostTrivialApi(const HostTrivialApi&) = delete;
  HostTrivialApi& operator=(const HostTrivialApi&) = delete;
  virtual ~HostTrivialApi(){};
  virtual std::optional<FlutterError> Noop() = 0;

  // The codec used by HostTrivialApi.
  static const flutter::StandardMessageCodec& GetCodec();
  // Sets up an instance of `HostTrivialApi` to handle messages through the
  // `binary_messenger`.
  static void SetUp(flutter::BinaryMessenger* binary_messenger,
                    HostTrivialApi* api);
  static flutter::EncodableList WrapError(std::string_view error_message);
  static flutter::EncodableList WrapError(const FlutterError& error);

 protected:
  HostTrivialApi() = default;
};
}  // namespace core_tests_pigeontest
#endif  // PIGEON_CORE_TESTS_GEN_CORE_TESTS_PIGEONTEST_H_
