///
/// DfuOptions.swift
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

import NitroModules

/**
 * Represents an instance of `DfuOptions`, backed by a C++ struct.
 */
public typealias DfuOptions = margelo.nitro.co.zyke.dfu.DfuOptions

public extension DfuOptions {
  private typealias bridge = margelo.nitro.co.zyke.dfu.bridge.swift

  /**
   * Create a new instance of `DfuOptions`.
   */
  init(deviceId: String, filePath: String, firmwareType: DfuFirmwareType?, packetReceiptNotificationParameter: Double?, forceDfu: Bool?, enableUnsafeExperimentalButtonlessDfu: Bool?, forceScanningForNewAddressInLegacyDfu: Bool?, numberOfRetries: Double?, connectionTimeout: Double?, dataObjectPreparationDelay: Double?, alternativeAdvertisingNameEnabled: Bool?, disableResume: Bool?) {
    self.init(std.string(deviceId), std.string(filePath), { () -> bridge.std__optional_DfuFirmwareType_ in
      if let __unwrappedValue = firmwareType {
        return bridge.create_std__optional_DfuFirmwareType_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = packetReceiptNotificationParameter {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = forceDfu {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = enableUnsafeExperimentalButtonlessDfu {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = forceScanningForNewAddressInLegacyDfu {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = numberOfRetries {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = connectionTimeout {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = dataObjectPreparationDelay {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = alternativeAdvertisingNameEnabled {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = disableResume {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var deviceId: String {
    return String(self.__deviceId)
  }
  
  @inline(__always)
  var filePath: String {
    return String(self.__filePath)
  }
  
  @inline(__always)
  var firmwareType: DfuFirmwareType? {
    return self.__firmwareType.has_value() ? self.__firmwareType.pointee : nil
  }
  
  @inline(__always)
  var packetReceiptNotificationParameter: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__packetReceiptNotificationParameter) {
        let __unwrapped = bridge.get_std__optional_double_(self.__packetReceiptNotificationParameter)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var forceDfu: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__forceDfu) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__forceDfu)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var enableUnsafeExperimentalButtonlessDfu: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__enableUnsafeExperimentalButtonlessDfu) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__enableUnsafeExperimentalButtonlessDfu)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var forceScanningForNewAddressInLegacyDfu: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__forceScanningForNewAddressInLegacyDfu) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__forceScanningForNewAddressInLegacyDfu)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var numberOfRetries: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__numberOfRetries) {
        let __unwrapped = bridge.get_std__optional_double_(self.__numberOfRetries)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var connectionTimeout: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__connectionTimeout) {
        let __unwrapped = bridge.get_std__optional_double_(self.__connectionTimeout)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var dataObjectPreparationDelay: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__dataObjectPreparationDelay) {
        let __unwrapped = bridge.get_std__optional_double_(self.__dataObjectPreparationDelay)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var alternativeAdvertisingNameEnabled: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__alternativeAdvertisingNameEnabled) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__alternativeAdvertisingNameEnabled)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var disableResume: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__disableResume) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__disableResume)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
}
