///
/// RnFawryPaySdk-Swift-Cxx-Bridge.hpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © 2025 Marc Rousavy @ Margelo
///

#pragma once

// Forward declarations of C++ defined types
// Forward declaration of `BillItems` to properly resolve imports.
namespace margelo::nitro::fawrypay_rnfawrypaysdk { struct BillItems; }
// Forward declaration of `HybridRnFawryPaySdkSpec` to properly resolve imports.
namespace margelo::nitro::fawrypay_rnfawrypaysdk { class HybridRnFawryPaySdkSpec; }
// Forward declaration of `LaunchApplePayModel` to properly resolve imports.
namespace margelo::nitro::fawrypay_rnfawrypaysdk { struct LaunchApplePayModel; }
// Forward declaration of `LaunchCheckoutModel` to properly resolve imports.
namespace margelo::nitro::fawrypay_rnfawrypaysdk { struct LaunchCheckoutModel; }

// Forward declarations of Swift defined types
// Forward declaration of `HybridRnFawryPaySdkSpec_cxx` to properly resolve imports.
namespace RnFawryPaySdk { class HybridRnFawryPaySdkSpec_cxx; }

// Include C++ defined types
#include "BillItems.hpp"
#include "HybridRnFawryPaySdkSpec.hpp"
#include "LaunchApplePayModel.hpp"
#include "LaunchCheckoutModel.hpp"
#include <NitroModules/Result.hpp>
#include <exception>
#include <functional>
#include <memory>
#include <optional>
#include <string>
#include <vector>

/**
 * Contains specialized versions of C++ templated types so they can be accessed from Swift,
 * as well as helper functions to interact with those C++ types from Swift.
 */
namespace margelo::nitro::fawrypay_rnfawrypaysdk::bridge::swift {

  // pragma MARK: std::optional<std::string>
  /**
   * Specialized version of `std::optional<std::string>`.
   */
  using std__optional_std__string_ = std::optional<std::string>;
  inline std::optional<std::string> create_std__optional_std__string_(const std::string& value) {
    return std::optional<std::string>(value);
  }
  
  // pragma MARK: std::vector<BillItems>
  /**
   * Specialized version of `std::vector<BillItems>`.
   */
  using std__vector_BillItems_ = std::vector<BillItems>;
  inline std::vector<BillItems> create_std__vector_BillItems_(size_t size) {
    std::vector<BillItems> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::optional<bool>
  /**
   * Specialized version of `std::optional<bool>`.
   */
  using std__optional_bool_ = std::optional<bool>;
  inline std::optional<bool> create_std__optional_bool_(const bool& value) {
    return std::optional<bool>(value);
  }
  
  // pragma MARK: std::optional<LaunchApplePayModel>
  /**
   * Specialized version of `std::optional<LaunchApplePayModel>`.
   */
  using std__optional_LaunchApplePayModel_ = std::optional<LaunchApplePayModel>;
  inline std::optional<LaunchApplePayModel> create_std__optional_LaunchApplePayModel_(const LaunchApplePayModel& value) {
    return std::optional<LaunchApplePayModel>(value);
  }
  
  // pragma MARK: std::optional<LaunchCheckoutModel>
  /**
   * Specialized version of `std::optional<LaunchCheckoutModel>`.
   */
  using std__optional_LaunchCheckoutModel_ = std::optional<LaunchCheckoutModel>;
  inline std::optional<LaunchCheckoutModel> create_std__optional_LaunchCheckoutModel_(const LaunchCheckoutModel& value) {
    return std::optional<LaunchCheckoutModel>(value);
  }
  
  // pragma MARK: std::function<void()>
  /**
   * Specialized version of `std::function<void()>`.
   */
  using Func_void = std::function<void()>;
  /**
   * Wrapper class for a `std::function<void()>`, this can be used from Swift.
   */
  class Func_void_Wrapper final {
  public:
    explicit Func_void_Wrapper(std::function<void()>&& func): _function(std::make_shared<std::function<void()>>(std::move(func))) {}
    inline void call() const {
      _function->operator()();
    }
  private:
    std::shared_ptr<std::function<void()>> _function;
  };
  Func_void create_Func_void(void* _Nonnull swiftClosureWrapper);
  inline Func_void_Wrapper wrap_Func_void(Func_void value) {
    return Func_void_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(const std::string& /* eventName */, const std::string& /* payload */)>
  /**
   * Specialized version of `std::function<void(const std::string&, const std::string&)>`.
   */
  using Func_void_std__string_std__string = std::function<void(const std::string& /* eventName */, const std::string& /* payload */)>;
  /**
   * Wrapper class for a `std::function<void(const std::string& / * eventName * /, const std::string& / * payload * /)>`, this can be used from Swift.
   */
  class Func_void_std__string_std__string_Wrapper final {
  public:
    explicit Func_void_std__string_std__string_Wrapper(std::function<void(const std::string& /* eventName */, const std::string& /* payload */)>&& func): _function(std::make_shared<std::function<void(const std::string& /* eventName */, const std::string& /* payload */)>>(std::move(func))) {}
    inline void call(std::string eventName, std::string payload) const {
      _function->operator()(eventName, payload);
    }
  private:
    std::shared_ptr<std::function<void(const std::string& /* eventName */, const std::string& /* payload */)>> _function;
  };
  Func_void_std__string_std__string create_Func_void_std__string_std__string(void* _Nonnull swiftClosureWrapper);
  inline Func_void_std__string_std__string_Wrapper wrap_Func_void_std__string_std__string(Func_void_std__string_std__string value) {
    return Func_void_std__string_std__string_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::shared_ptr<margelo::nitro::fawrypay_rnfawrypaysdk::HybridRnFawryPaySdkSpec>
  /**
   * Specialized version of `std::shared_ptr<margelo::nitro::fawrypay_rnfawrypaysdk::HybridRnFawryPaySdkSpec>`.
   */
  using std__shared_ptr_margelo__nitro__fawrypay_rnfawrypaysdk__HybridRnFawryPaySdkSpec_ = std::shared_ptr<margelo::nitro::fawrypay_rnfawrypaysdk::HybridRnFawryPaySdkSpec>;
  std::shared_ptr<margelo::nitro::fawrypay_rnfawrypaysdk::HybridRnFawryPaySdkSpec> create_std__shared_ptr_margelo__nitro__fawrypay_rnfawrypaysdk__HybridRnFawryPaySdkSpec_(void* _Nonnull swiftUnsafePointer);
  void* _Nonnull get_std__shared_ptr_margelo__nitro__fawrypay_rnfawrypaysdk__HybridRnFawryPaySdkSpec_(std__shared_ptr_margelo__nitro__fawrypay_rnfawrypaysdk__HybridRnFawryPaySdkSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<margelo::nitro::fawrypay_rnfawrypaysdk::HybridRnFawryPaySdkSpec>
  using std__weak_ptr_margelo__nitro__fawrypay_rnfawrypaysdk__HybridRnFawryPaySdkSpec_ = std::weak_ptr<margelo::nitro::fawrypay_rnfawrypaysdk::HybridRnFawryPaySdkSpec>;
  inline std__weak_ptr_margelo__nitro__fawrypay_rnfawrypaysdk__HybridRnFawryPaySdkSpec_ weakify_std__shared_ptr_margelo__nitro__fawrypay_rnfawrypaysdk__HybridRnFawryPaySdkSpec_(const std::shared_ptr<margelo::nitro::fawrypay_rnfawrypaysdk::HybridRnFawryPaySdkSpec>& strong) { return strong; }
  
  // pragma MARK: Result<double>
  using Result_double_ = Result<double>;
  inline Result_double_ create_Result_double_(double value) {
    return Result<double>::withValue(std::move(value));
  }
  inline Result_double_ create_Result_double_(const std::exception_ptr& error) {
    return Result<double>::withError(error);
  }
  
  // pragma MARK: Result<void>
  using Result_void_ = Result<void>;
  inline Result_void_ create_Result_void_() {
    return Result<void>::withValue();
  }
  inline Result_void_ create_Result_void_(const std::exception_ptr& error) {
    return Result<void>::withError(error);
  }
  
  // pragma MARK: Result<std::function<void()>>
  using Result_std__function_void____ = Result<std::function<void()>>;
  inline Result_std__function_void____ create_Result_std__function_void____(const std::function<void()>& value) {
    return Result<std::function<void()>>::withValue(value);
  }
  inline Result_std__function_void____ create_Result_std__function_void____(const std::exception_ptr& error) {
    return Result<std::function<void()>>::withError(error);
  }

} // namespace margelo::nitro::fawrypay_rnfawrypaysdk::bridge::swift
