036856aed5
* Move everything into package * Remove .DS_Store * Move scripts and eslintrc to package * Create CODE_OF_CONDUCT.md * fix some links * Update all links (I think) * Update generated docs * Update notice-yarn-changes.yml * Update validate-android.yml * Update validate-cpp.yml * Delete notice-yarn-changes.yml * Update validate-cpp.yml * Update validate-cpp.yml * Update validate-js.yml * Update validate-cpp.yml * Update validate-cpp.yml * wrong c++ style * Revert "wrong c++ style" This reverts commit 55a3575589c6f13f8b05134d83384f55e0601ab2.
70 lines
1.8 KiB
Swift
70 lines
1.8 KiB
Swift
//
|
|
// Promise.swift
|
|
// mrousavy
|
|
//
|
|
// Created by Marc Rousavy on 14.01.21.
|
|
// Copyright © 2021 mrousavy. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
// MARK: - Promise
|
|
|
|
/**
|
|
* Represents a JavaScript Promise instance. `reject()` and `resolve()` should only be called once.
|
|
*/
|
|
class Promise {
|
|
init(resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
self.resolver = resolver
|
|
self.rejecter = rejecter
|
|
}
|
|
|
|
func reject(error: CameraError, cause: NSError?) {
|
|
rejecter(error.code, error.message, cause)
|
|
}
|
|
|
|
func reject(error: CameraError) {
|
|
reject(error: error, cause: nil)
|
|
}
|
|
|
|
func resolve(_ value: Any?) {
|
|
resolver(value)
|
|
}
|
|
|
|
func resolve() {
|
|
resolve(nil)
|
|
}
|
|
|
|
// MARK: Private
|
|
|
|
private let resolver: RCTPromiseResolveBlock
|
|
private let rejecter: RCTPromiseRejectBlock
|
|
}
|
|
|
|
/**
|
|
* Wrap a block with an automatic promise resolver and rejecter.
|
|
*
|
|
* The value returned by the `block` must be serializable by the React Native bridge, or `nil`.
|
|
* The error thrown by the `block` should be a `CameraError`
|
|
*/
|
|
func withPromise(_ promise: Promise, _ block: () throws -> Any?) {
|
|
do {
|
|
let result = try block()
|
|
promise.resolve(result)
|
|
} catch let error as CameraError {
|
|
promise.reject(error: error)
|
|
} catch let error as NSError {
|
|
promise.reject(error: CameraError.unknown(message: error.description), cause: error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Wrap a block with an automatic promise resolver and rejecter.
|
|
*
|
|
* The value returned by the `block` must be serializable by the React Native bridge, or `nil`.
|
|
* The error thrown by the `block` should be a `CameraError`
|
|
*/
|
|
func withPromise(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock, _ block: () throws -> Any?) {
|
|
return withPromise(Promise(resolver: resolve, rejecter: reject), block)
|
|
}
|