Skip to content

Commit

Permalink
Merge pull request #13 from MoveUpwards/feature/swift-result-type
Browse files Browse the repository at this point in the history
Feature/swift result type
  • Loading branch information
MoveUpwardsDev committed May 27, 2019
2 parents 829bc9e + fa575df commit 29b93de
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 87 deletions.
4 changes: 4 additions & 0 deletions Gormsson/Gormsson.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
6DE3E6962265E02F004BCFFA /* Gormsson+Write.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DE3E6952265E02F004BCFFA /* Gormsson+Write.swift */; };
6DF480952268A9F5006504BF /* CustomHeartRate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DF480942268A9F5006504BF /* CustomHeartRate.swift */; };
B694B63D7AA0FE0D4F39AFE5 /* Pods_Gormsson.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A5E69FA962B0ACEBF88B0EF /* Pods_Gormsson.framework */; };
F310165A229BEDC900F25D2D /* GormssonEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3101659229BEDC900F25D2D /* GormssonEmpty.swift */; };
F3502AB42260C55800814ECC /* GormssonError.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3502AB32260C55800814ECC /* GormssonError.swift */; };
F3502AB62260D31B00814ECC /* Gormsson+CentralManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3502AB52260D31B00814ECC /* Gormsson+CentralManager.swift */; };
F3502AB82260D37F00814ECC /* Gormsson+Peripheral.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3502AB72260D37F00814ECC /* Gormsson+Peripheral.swift */; };
Expand Down Expand Up @@ -41,6 +42,7 @@
6DE3E6952265E02F004BCFFA /* Gormsson+Write.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Gormsson+Write.swift"; sourceTree = "<group>"; };
6DF480942268A9F5006504BF /* CustomHeartRate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomHeartRate.swift; sourceTree = "<group>"; };
B6B729859F371A08BAB99043 /* Pods-Gormsson.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Gormsson.release.xcconfig"; path = "Target Support Files/Pods-Gormsson/Pods-Gormsson.release.xcconfig"; sourceTree = "<group>"; };
F3101659229BEDC900F25D2D /* GormssonEmpty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GormssonEmpty.swift; sourceTree = "<group>"; };
F3502AB32260C55800814ECC /* GormssonError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GormssonError.swift; sourceTree = "<group>"; };
F3502AB52260D31B00814ECC /* Gormsson+CentralManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Gormsson+CentralManager.swift"; sourceTree = "<group>"; };
F3502AB72260D37F00814ECC /* Gormsson+Peripheral.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Gormsson+Peripheral.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -125,6 +127,7 @@
isa = PBXGroup;
children = (
F39E39D6225E391E003804A7 /* Gormsson.swift */,
F3101659229BEDC900F25D2D /* GormssonEmpty.swift */,
F3502AB32260C55800814ECC /* GormssonError.swift */,
6DE3E68F2265DC69004BCFFA /* GormssonState.swift */,
F39E39D5225E391E003804A7 /* GattRequest.swift */,
Expand Down Expand Up @@ -323,6 +326,7 @@
6DE3E6922265DEA4004BCFFA /* Gormsson+Read.swift in Sources */,
F39E39E2225E391E003804A7 /* Gormsson.swift in Sources */,
6DE3E6892264C5F1004BCFFA /* DataInitializable+HeartRate.swift in Sources */,
F310165A229BEDC900F25D2D /* GormssonEmpty.swift in Sources */,
F39E39E0225E391E003804A7 /* GattCharacteristic.swift in Sources */,
F39E39E6225E391E003804A7 /* GenericAccess.swift in Sources */,
6DF480952268A9F5006504BF /* CustomHeartRate.swift in Sources */,
Expand Down
14 changes: 6 additions & 8 deletions Gormsson/Source/Extensions/Gormsson+Notify.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,23 @@ import Nevanlinna
extension Gormsson {
/// Starts notifications or indications for the value of a base characteristic.
public func notify(_ characteristic: GattCharacteristic,
success: @escaping (DataInitializable?) -> Void,
error: @escaping (Error?) -> Void) {
notify(characteristic.characteristic, success: success, error: error)
result: @escaping (Result<DataInitializable, Error>) -> Void) {
notify(characteristic.characteristic, result: result)
}

/// Starts notifications or indications for the value of a base characteristic.
public func notify(_ characteristic: CharacteristicProtocol,
success: @escaping (DataInitializable?) -> Void,
error: @escaping (Error?) -> Void) {
result: @escaping (Result<DataInitializable, Error>) -> Void) {
guard state == .isPoweredOn else {
error(GormssonError.powerOff)
result(.failure(GormssonError.powerOff))
return
}

let request = GattRequest(.notify, characteristic: characteristic, success: success, error: error)
let request = GattRequest(.notify, characteristic: characteristic, result: result)

guard !isDiscovering else {
guard !pendingRequests.contains(request) else {
request.error?(GormssonError.alreadyNotifying)
request.result?(.failure(GormssonError.alreadyNotifying))
return
}

Expand Down
29 changes: 23 additions & 6 deletions Gormsson/Source/Extensions/Gormsson+Peripheral.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//

import CoreBluetooth
import Nevanlinna

extension Gormsson: CBPeripheralDelegate {
/// Invoked when you discover the peripheral’s available services.
Expand Down Expand Up @@ -49,7 +50,11 @@ extension Gormsson: CBPeripheralDelegate {
currentRequests.filter({ $0.characteristic.uuid == characteristic.uuid })
.filter({ characteristic.properties.contains($0.property) })
.forEach { request in
error != nil ? request.error?(error) : compute(request, with: characteristic)
if let error = error {
request.result?(.failure(error))
} else {
compute(request, with: characteristic)
}

switch request.property {
case .read:
Expand All @@ -70,7 +75,11 @@ extension Gormsson: CBPeripheralDelegate {
currentRequests.filter({ $0.characteristic.uuid == characteristic.uuid })
.filter({ characteristic.properties.contains($0.property) && $0.property == .notify })
.forEach { request in
error != nil ? request.error?(error) : read(request, append: false)
if let error = error {
request.result?(.failure(error))
} else {
read(request, append: false)
}
}
}

Expand All @@ -83,7 +92,11 @@ extension Gormsson: CBPeripheralDelegate {
currentRequests.filter({ $0.characteristic.uuid == characteristic.uuid })
.filter({ characteristic.properties.contains($0.property) && $0.property == .write })
.forEach { request in
error != nil ? request.error?(error) : compute(request, with: characteristic)
if let error = error {
request.result?(.failure(error))
} else {
compute(request, with: characteristic)
}

deletedRequest.append(request)
}
Expand All @@ -95,11 +108,15 @@ extension Gormsson: CBPeripheralDelegate {

private func compute(_ request: GattRequest, with characteristic: CBCharacteristic) {
guard let data = characteristic.value else {
request.success?(nil)
request.result?(.success(GormssonEmpty()))
return
}

guard let value = request.characteristic.format.init(with: data.toOctets) else {
request.result?(.failure(GormssonError.uncastableValue))
return
}

let value = request.characteristic.format.init(with: data.toOctets)
request.success?(value)
request.result?(.success(value))
}
}
12 changes: 5 additions & 7 deletions Gormsson/Source/Extensions/Gormsson+Read.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,19 @@ import Nevanlinna
extension Gormsson {
/// Reads the value of a base characteristic.
public func read(_ characteristic: GattCharacteristic,
success: @escaping (DataInitializable?) -> Void,
error: @escaping (Error?) -> Void) {
read(characteristic.characteristic, success: success, error: error)
result: @escaping (Result<DataInitializable, Error>) -> Void) {
read(characteristic.characteristic, result: result)
}

/// Reads the value of a custom characteristic.
public func read(_ characteristic: CharacteristicProtocol,
success: @escaping (DataInitializable?) -> Void,
error: @escaping (Error?) -> Void) {
result: @escaping (Result<DataInitializable, Error>) -> Void) {
guard state == .isPoweredOn else {
error(GormssonError.powerOff)
result(.failure(GormssonError.powerOff))
return
}

let request = GattRequest(.read, characteristic: characteristic, success: success, error: error)
let request = GattRequest(.read, characteristic: characteristic, result: result)

guard !isDiscovering else {
pendingRequests.append(request)
Expand Down
15 changes: 5 additions & 10 deletions Gormsson/Source/Extensions/Gormsson+Write.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,21 @@ extension Gormsson {
public func write(_ characteristic: GattCharacteristic,
value: DataConvertible,
type: CBCharacteristicWriteType = .withResponse,
success: @escaping (DataInitializable?) -> Void,
error: @escaping (Error?) -> Void) {
write(characteristic.characteristic, value: value, type: type, success: success, error: error)
result: @escaping (Result<DataInitializable, Error>) -> Void) {
write(characteristic.characteristic, value: value, type: type, result: result)
}

/// Writes the value of a custom characteristic.
public func write(_ characteristic: CharacteristicProtocol,
value: DataConvertible,
type: CBCharacteristicWriteType = .withResponse,
success: @escaping (DataInitializable?) -> Void,
error: @escaping (Error?) -> Void) {
result: @escaping (Result<DataInitializable, Error>) -> Void) {
guard state == .isPoweredOn else {
error(GormssonError.powerOff)
result(.failure(GormssonError.powerOff))
return
}

let request = GattRequest(.write,
characteristic: characteristic,
success: success,
error: error)
let request = GattRequest(.write, characteristic: characteristic, result: result)

guard !isDiscovering else {
pendingRequests.append(request)
Expand Down
12 changes: 4 additions & 8 deletions Gormsson/Source/GattRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,16 @@ internal final class GattRequest {
internal var property: CBCharacteristicProperties
/// The Gormsson's characteristic.
internal var characteristic: CharacteristicProtocol
/// The block to call on succeed request.
internal var success: ((DataInitializable?) -> Void)?
/// The block to call on error request.
internal var error: ((Error?) -> Void)?
/// The result
internal var result: ((Result<DataInitializable, Error>) -> Void)?

/// Init with some default values.
internal init(_ property: CBCharacteristicProperties,
characteristic: CharacteristicProtocol,
success: ((DataInitializable?) -> Void)? = nil,
error: ((Error?) -> Void)? = nil) {
result: ((Result<DataInitializable, Error>) -> Void)? = nil) {
self.property = property
self.characteristic = characteristic
self.success = success
self.error = error
self.result = result
}
}

Expand Down
20 changes: 10 additions & 10 deletions Gormsson/Source/Gormsson.swift
Original file line number Diff line number Diff line change
Expand Up @@ -122,17 +122,17 @@ public final class Gormsson: NSObject {
/// Reads the value of a characteristic from a request.
internal func read(_ request: GattRequest, append: Bool = true) {
guard state == .isPoweredOn else {
request.error?(GormssonError.powerOff)
request.result?(.failure(GormssonError.powerOff))
return
}

guard let current = current else {
request.error?(GormssonError.deviceUnconnected)
request.result?(.failure(GormssonError.deviceUnconnected))
return
}

guard let cbCharacteristic = get(request.characteristic) else {
request.error?(GormssonError.characteristicNotFound)
request.result?(.failure(GormssonError.characteristicNotFound))
return
}

Expand All @@ -146,22 +146,22 @@ public final class Gormsson: NSObject {
/// Starts notifications for the value of a characteristic from a request.
internal func notify(_ request: GattRequest) {
guard state == .isPoweredOn else {
request.error?(GormssonError.powerOff)
request.result?(.failure(GormssonError.powerOff))
return
}

guard let current = current else {
request.error?(GormssonError.deviceUnconnected)
request.result?(.failure(GormssonError.deviceUnconnected))
return
}

guard let cbCharacteristic = get(request.characteristic) else {
request.error?(GormssonError.characteristicNotFound)
request.result?(.failure(GormssonError.characteristicNotFound))
return
}

guard !cbCharacteristic.isNotifying, !currentRequests.contains(request) else {
request.error?(GormssonError.alreadyNotifying)
request.result?(.failure(GormssonError.alreadyNotifying))
return
}

Expand All @@ -174,17 +174,17 @@ public final class Gormsson: NSObject {
value: DataConvertible,
type: CBCharacteristicWriteType = .withResponse) {
guard state == .isPoweredOn else {
request.error?(GormssonError.powerOff)
request.result?(.failure(GormssonError.powerOff))
return
}

guard let current = current else {
request.error?(GormssonError.deviceUnconnected)
request.result?(.failure(GormssonError.deviceUnconnected))
return
}

guard let cbCharacteristic = get(request.characteristic) else {
request.error?(GormssonError.characteristicNotFound)
request.result?(.failure(GormssonError.characteristicNotFound))
return
}

Expand Down
24 changes: 24 additions & 0 deletions Gormsson/Source/GormssonEmpty.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// GormssonEmpty.swift
// Gormsson
//
// Created by Loïc GRIFFIE on 27/05/2019.
// Copyright © 2019 Loïc GRIFFIE. All rights reserved.
//

import Foundation
import Nevanlinna

/// A type representing an empty response
public struct GormssonEmpty: DataInitializable, DataConvertible {
/// Initialize an empty object
public init() { }

/// Initialize the object from octets' array.
public init?(with octets: [UInt8]) { }

/// Return Data of the object.
public func toData() -> Data {
return Data()
}
}

0 comments on commit 29b93de

Please sign in to comment.