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

#include "NitroIap-Swift-Cxx-Bridge.hpp"

// Include C++ implementation defined types
#include "HybridRnIapSpecSwift.hpp"
#include "NitroIap-Swift-Cxx-Umbrella.hpp"
#include <NitroModules/NitroDefines.hpp>

namespace margelo::nitro::iap::bridge::swift {

  // pragma MARK: std::function<void(bool /* result */)>
  Func_void_bool create_Func_void_bool(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_bool::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](bool result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const std::exception_ptr& /* error */)>
  Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__exception_ptr::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::exception_ptr& error) mutable -> void {
      swiftClosure.call(error);
    };
  }
  
  // pragma MARK: std::function<void(const std::vector<NitroProduct>& /* result */)>
  Func_void_std__vector_NitroProduct_ create_Func_void_std__vector_NitroProduct_(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__vector_NitroProduct_::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::vector<NitroProduct>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const std::variant<nitro::NullType, PurchaseAndroid, PurchaseIOS, std::vector<std::variant<PurchaseAndroid, PurchaseIOS>>>& /* result */)>
  Func_void_std__variant_nitro__NullType__PurchaseAndroid__PurchaseIOS__std__vector_std__variant_PurchaseAndroid__PurchaseIOS___ create_Func_void_std__variant_nitro__NullType__PurchaseAndroid__PurchaseIOS__std__vector_std__variant_PurchaseAndroid__PurchaseIOS___(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__variant_nitro__NullType__PurchaseAndroid__PurchaseIOS__std__vector_std__variant_PurchaseAndroid__PurchaseIOS___::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::variant<nitro::NullType, PurchaseAndroid, PurchaseIOS, std::vector<std::variant<PurchaseAndroid, PurchaseIOS>>>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const std::vector<NitroPurchase>& /* result */)>
  Func_void_std__vector_NitroPurchase_ create_Func_void_std__vector_NitroPurchase_(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__vector_NitroPurchase_::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::vector<NitroPurchase>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const std::vector<NitroActiveSubscription>& /* result */)>
  Func_void_std__vector_NitroActiveSubscription_ create_Func_void_std__vector_NitroActiveSubscription_(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__vector_NitroActiveSubscription_::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::vector<NitroActiveSubscription>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const std::variant<bool, NitroPurchaseResult>& /* result */)>
  Func_void_std__variant_bool__NitroPurchaseResult_ create_Func_void_std__variant_bool__NitroPurchaseResult_(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__variant_bool__NitroPurchaseResult_::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::variant<bool, NitroPurchaseResult>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const NitroPurchase& /* purchase */)>
  Func_void_NitroPurchase create_Func_void_NitroPurchase(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_NitroPurchase::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const NitroPurchase& purchase) mutable -> void {
      swiftClosure.call(purchase);
    };
  }
  
  // pragma MARK: std::function<void(const NitroPurchaseResult& /* error */)>
  Func_void_NitroPurchaseResult create_Func_void_NitroPurchaseResult(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_NitroPurchaseResult::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const NitroPurchaseResult& error) mutable -> void {
      swiftClosure.call(error);
    };
  }
  
  // pragma MARK: std::function<void(const NitroProduct& /* product */)>
  Func_void_NitroProduct create_Func_void_NitroProduct(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_NitroProduct::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const NitroProduct& product) mutable -> void {
      swiftClosure.call(product);
    };
  }
  
  // pragma MARK: std::function<void(const std::string& /* result */)>
  Func_void_std__string create_Func_void_std__string(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__string::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::string& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const std::variant<nitro::NullType, std::string>& /* result */)>
  Func_void_std__variant_nitro__NullType__std__string_ create_Func_void_std__variant_nitro__NullType__std__string_(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__variant_nitro__NullType__std__string_::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::variant<nitro::NullType, std::string>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const std::variant<nitro::NullType, NitroProduct>& /* result */)>
  Func_void_std__variant_nitro__NullType__NitroProduct_ create_Func_void_std__variant_nitro__NullType__NitroProduct_(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__variant_nitro__NullType__NitroProduct_::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::variant<nitro::NullType, NitroProduct>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void()>
  Func_void create_Func_void(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)]() mutable -> void {
      swiftClosure.call();
    };
  }
  
  // pragma MARK: std::function<void(const std::variant<nitro::NullType, std::vector<NitroSubscriptionStatus>>& /* result */)>
  Func_void_std__variant_nitro__NullType__std__vector_NitroSubscriptionStatus__ create_Func_void_std__variant_nitro__NullType__std__vector_NitroSubscriptionStatus__(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__variant_nitro__NullType__std__vector_NitroSubscriptionStatus__::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::variant<nitro::NullType, std::vector<NitroSubscriptionStatus>>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const std::variant<nitro::NullType, NitroPurchase>& /* result */)>
  Func_void_std__variant_nitro__NullType__NitroPurchase_ create_Func_void_std__variant_nitro__NullType__NitroPurchase_(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__variant_nitro__NullType__NitroPurchase_::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::variant<nitro::NullType, NitroPurchase>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const std::variant<NitroReceiptValidationResultIOS, NitroReceiptValidationResultAndroid>& /* result */)>
  Func_void_std__variant_NitroReceiptValidationResultIOS__NitroReceiptValidationResultAndroid_ create_Func_void_std__variant_NitroReceiptValidationResultIOS__NitroReceiptValidationResultAndroid_(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_std__variant_NitroReceiptValidationResultIOS__NitroReceiptValidationResultAndroid_::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const std::variant<NitroReceiptValidationResultIOS, NitroReceiptValidationResultAndroid>& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const NitroVerifyPurchaseWithProviderResult& /* result */)>
  Func_void_NitroVerifyPurchaseWithProviderResult create_Func_void_NitroVerifyPurchaseWithProviderResult(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_NitroVerifyPurchaseWithProviderResult::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const NitroVerifyPurchaseWithProviderResult& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const UserChoiceBillingDetails& /* details */)>
  Func_void_UserChoiceBillingDetails create_Func_void_UserChoiceBillingDetails(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_UserChoiceBillingDetails::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const UserChoiceBillingDetails& details) mutable -> void {
      swiftClosure.call(details);
    };
  }
  
  // pragma MARK: std::function<void(const DeveloperProvidedBillingDetailsAndroid& /* details */)>
  Func_void_DeveloperProvidedBillingDetailsAndroid create_Func_void_DeveloperProvidedBillingDetailsAndroid(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_DeveloperProvidedBillingDetailsAndroid::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const DeveloperProvidedBillingDetailsAndroid& details) mutable -> void {
      swiftClosure.call(details);
    };
  }
  
  // pragma MARK: std::function<void(const NitroBillingProgramAvailabilityResultAndroid& /* result */)>
  Func_void_NitroBillingProgramAvailabilityResultAndroid create_Func_void_NitroBillingProgramAvailabilityResultAndroid(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_NitroBillingProgramAvailabilityResultAndroid::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const NitroBillingProgramAvailabilityResultAndroid& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const NitroBillingProgramReportingDetailsAndroid& /* result */)>
  Func_void_NitroBillingProgramReportingDetailsAndroid create_Func_void_NitroBillingProgramReportingDetailsAndroid(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_NitroBillingProgramReportingDetailsAndroid::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const NitroBillingProgramReportingDetailsAndroid& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const ExternalPurchaseNoticeResultIOS& /* result */)>
  Func_void_ExternalPurchaseNoticeResultIOS create_Func_void_ExternalPurchaseNoticeResultIOS(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_ExternalPurchaseNoticeResultIOS::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const ExternalPurchaseNoticeResultIOS& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const ExternalPurchaseLinkResultIOS& /* result */)>
  Func_void_ExternalPurchaseLinkResultIOS create_Func_void_ExternalPurchaseLinkResultIOS(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_ExternalPurchaseLinkResultIOS::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const ExternalPurchaseLinkResultIOS& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const ExternalPurchaseCustomLinkTokenResultIOS& /* result */)>
  Func_void_ExternalPurchaseCustomLinkTokenResultIOS create_Func_void_ExternalPurchaseCustomLinkTokenResultIOS(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_ExternalPurchaseCustomLinkTokenResultIOS::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const ExternalPurchaseCustomLinkTokenResultIOS& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const ExternalPurchaseCustomLinkNoticeResultIOS& /* result */)>
  Func_void_ExternalPurchaseCustomLinkNoticeResultIOS create_Func_void_ExternalPurchaseCustomLinkNoticeResultIOS(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = NitroIap::Func_void_ExternalPurchaseCustomLinkNoticeResultIOS::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const ExternalPurchaseCustomLinkNoticeResultIOS& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::shared_ptr<HybridRnIapSpec>
  std::shared_ptr<HybridRnIapSpec> create_std__shared_ptr_HybridRnIapSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
    NitroIap::HybridRnIapSpec_cxx swiftPart = NitroIap::HybridRnIapSpec_cxx::fromUnsafe(swiftUnsafePointer);
    return std::make_shared<margelo::nitro::iap::HybridRnIapSpecSwift>(swiftPart);
  }
  void* NON_NULL get_std__shared_ptr_HybridRnIapSpec_(std__shared_ptr_HybridRnIapSpec_ cppType) {
    std::shared_ptr<margelo::nitro::iap::HybridRnIapSpecSwift> swiftWrapper = std::dynamic_pointer_cast<margelo::nitro::iap::HybridRnIapSpecSwift>(cppType);
    #ifdef NITRO_DEBUG
    if (swiftWrapper == nullptr) [[unlikely]] {
      throw std::runtime_error("Class \"HybridRnIapSpec\" is not implemented in Swift!");
    }
    #endif
    NitroIap::HybridRnIapSpec_cxx& swiftPart = swiftWrapper->getSwiftPart();
    return swiftPart.toUnsafe();
  }

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