//
//  Callback.swift
//  VisionCamera
//
//  Created by Marc Rousavy on 07.06.21.
//  Copyright © 2021 mrousavy. All rights reserved.
//

import Foundation

/**
 Represents a callback to JavaScript. Syntax is the same as with Promise.
 */
class Callback {
  private var hasCalled = false
  private let callback: RCTResponseSenderBlock

  init(_ callback: @escaping RCTResponseSenderBlock) {
    self.callback = callback
  }

  func reject(error: CameraError, cause: NSError?) {
    guard !hasCalled else { return }

    callback([NSNull(), makeReactError(error, cause: cause)])
    hasCalled = true
  }

  func reject(error: CameraError) {
    guard !hasCalled else { return }

    reject(error: error, cause: nil)
    hasCalled = true
  }

  func resolve(_ value: Any) {
    guard !hasCalled else { return }

    callback([value, NSNull()])
    hasCalled = true
  }

  func resolve() {
    guard !hasCalled else { return }

    resolve(NSNull())
    hasCalled = true
  }
}