///
/// EspProvToolkit-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 "EspProvToolkit-Swift-Cxx-Bridge.hpp"

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

namespace margelo::nitro::espprovtoolkit::bridge::swift {

  // pragma MARK: std::function<void(const PTSearchResult& /* result */)>
  Func_void_PTSearchResult create_Func_void_PTSearchResult(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = EspProvToolkit::Func_void_PTSearchResult::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const PTSearchResult& 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 = EspProvToolkit::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 PTResult& /* result */)>
  Func_void_PTResult create_Func_void_PTResult(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = EspProvToolkit::Func_void_PTResult::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const PTResult& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const PTWifiScanResult& /* result */)>
  Func_void_PTWifiScanResult create_Func_void_PTWifiScanResult(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = EspProvToolkit::Func_void_PTWifiScanResult::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const PTWifiScanResult& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const PTSessionResult& /* result */)>
  Func_void_PTSessionResult create_Func_void_PTSessionResult(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = EspProvToolkit::Func_void_PTSessionResult::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const PTSessionResult& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const PTProvisionResult& /* result */)>
  Func_void_PTProvisionResult create_Func_void_PTProvisionResult(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = EspProvToolkit::Func_void_PTProvisionResult::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const PTProvisionResult& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<void(const PTStringResult& /* result */)>
  Func_void_PTStringResult create_Func_void_PTStringResult(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = EspProvToolkit::Func_void_PTStringResult::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](const PTStringResult& result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::function<std::shared_ptr<Promise<bool>>(PTLocationAccess /* level */)>
  Func_std__shared_ptr_Promise_bool___PTLocationAccess create_Func_std__shared_ptr_Promise_bool___PTLocationAccess(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = EspProvToolkit::Func_std__shared_ptr_Promise_bool___PTLocationAccess::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](PTLocationAccess level) mutable -> std::shared_ptr<Promise<bool>> {
      auto __result = swiftClosure.call(static_cast<int>(level));
      return __result;
    };
  }
  
  // pragma MARK: std::function<void(bool /* result */)>
  Func_void_bool create_Func_void_bool(void* NON_NULL swiftClosureWrapper) noexcept {
    auto swiftClosure = EspProvToolkit::Func_void_bool::fromUnsafe(swiftClosureWrapper);
    return [swiftClosure = std::move(swiftClosure)](bool result) mutable -> void {
      swiftClosure.call(result);
    };
  }
  
  // pragma MARK: std::shared_ptr<HybridEspProvToolkitSpec>
  std::shared_ptr<HybridEspProvToolkitSpec> create_std__shared_ptr_HybridEspProvToolkitSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
    EspProvToolkit::HybridEspProvToolkitSpec_cxx swiftPart = EspProvToolkit::HybridEspProvToolkitSpec_cxx::fromUnsafe(swiftUnsafePointer);
    return std::make_shared<margelo::nitro::espprovtoolkit::HybridEspProvToolkitSpecSwift>(swiftPart);
  }
  void* NON_NULL get_std__shared_ptr_HybridEspProvToolkitSpec_(std__shared_ptr_HybridEspProvToolkitSpec_ cppType) {
    std::shared_ptr<margelo::nitro::espprovtoolkit::HybridEspProvToolkitSpecSwift> swiftWrapper = std::dynamic_pointer_cast<margelo::nitro::espprovtoolkit::HybridEspProvToolkitSpecSwift>(cppType);
    #ifdef NITRO_DEBUG
    if (swiftWrapper == nullptr) [[unlikely]] {
      throw std::runtime_error("Class \"HybridEspProvToolkitSpec\" is not implemented in Swift!");
    }
    #endif
    EspProvToolkit::HybridEspProvToolkitSpec_cxx& swiftPart = swiftWrapper->getSwiftPart();
    return swiftPart.toUnsafe();
  }

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