Skip to content

Commit e7f5225

Browse files
author
Fernando Fernandes
committed
Refactor and fixes for Vapor integration
1 parent 09e2804 commit e7f5225

File tree

8 files changed

+47
-29
lines changed

8 files changed

+47
-29
lines changed

Sources/SwiftTrader/Extensions/Decodable+String.swift

Lines changed: 0 additions & 20 deletions
This file was deleted.

Sources/SwiftTrader/Network/Kucoin/AccountOverview/KucoinAccountOverviewRequest.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
//
77

88
import Foundation
9+
#if canImport(FoundationNetworking)
10+
import FoundationNetworking
11+
#endif
912

1013
/// A **request** for an overview of a Kucoin Futures account.
1114
///
@@ -50,7 +53,7 @@ public struct KucoinAccountOverviewRequest: NetworkRequest {
5053

5154
public extension KucoinAccountOverviewRequest {
5255

53-
func decode(_ data: Data) throws -> KucoinFuturesAccountOverviewResponse {
56+
func decode(_ data: Data) throws -> DecodableModel {
5457
try JSONDecoder().decode(KucoinFuturesAccountOverviewResponse.self, from: data)
5558
}
5659
}

Sources/SwiftTrader/Network/Kucoin/KucoinAPI+Header.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
//
77

88
import Foundation
9+
#if canImport(FoundationNetworking)
10+
import FoundationNetworking
11+
#endif
912

1013
/// Holds logic to set values for default HTTP header fields common to all Kucoin APIs requests.
1114
extension KucoinAPI {

Sources/SwiftTrader/Network/NetworkRequest/NetworkRequestError.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ public enum NetworkRequestError: Error {
1919
/// Could not cast response to `HTTPURLResponse`.
2020
case invalidResponse
2121

22+
/// Could not instantiate a valid `URLRequest` (e.g.: `NetworkRequest.getter:request`).
23+
case invalidRequest(error: Error)
24+
2225
/// Could not instantiate a `URLComponents` struct using the given `String` URL.
2326
case invalidURLString(urlString: String)
2427

Sources/SwiftTrader/Network/NetworkRequest/NetworkRequestProtocol+Execution.swift

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,45 @@ public extension NetworkRequest {
2222
/// - Parameter request: `URLRequest` containing the target `URL`.
2323
/// - Returns: `NetworkRequestResult`.
2424
func execute() async -> NetworkRequestResult {
25+
let req: URLRequest
26+
do {
27+
req = try request
28+
} catch {
29+
return .failure(.invalidRequest(error: error))
30+
}
2531
#if os(macOS) || os(iOS)
32+
return await runOnApplePlatforms(request: req)
33+
#elseif canImport(FoundationNetworking)
34+
return await runOnLinux(request: req)
35+
#endif
36+
}
37+
}
38+
39+
#warning("TODO: retry mechanism, at least 3 times")
40+
41+
// MARK: - Private
42+
43+
private extension NetworkRequest {
44+
45+
#if os(macOS) || os(iOS)
46+
/// macOS and iOS.
47+
func runOnApplePlatforms(request: URLRequest) async -> NetworkRequestResult {
2648
do {
2749
let (data, response) = try await session.data(for: request)
2850
return handleResult(data: data, response: response)
2951
} catch {
30-
return handleResult(data: nil, response: nil, error: error)
52+
return .failure(.requestFailed(error: error))
3153
}
32-
#elseif canImport(FoundationNetworking)
33-
// `async/await` isn't fully ported to Linux; use "withCheckedContinuation(function:_:)" instead.
34-
let (data, response, error) = await withCheckedContinuation { continuation in
54+
}
55+
#endif
56+
57+
/// `async/await` isn't fully ported to Linux; use "withCheckedContinuation(function:_:)" instead.
58+
func runOnLinux(request: URLRequest) async -> NetworkRequestResult {
59+
let (data, response, error) = await withCheckedContinuation { continuation in
3560
session.dataTask(with: request) { data, response, error in
3661
continuation.resume(returning: (data, response, error))
3762
}.resume()
38-
return handleResult(data: data, response: response, error: error)
3963
}
40-
#endif
64+
return handleResult(data: data, response: response, error: error)
4165
}
4266
}

Sources/SwiftTrader/Network/NetworkRequest/NetworkRequestProtocol+Result.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
//
77

88
import Foundation
9+
#if canImport(FoundationNetworking)
10+
import FoundationNetworking
11+
#endif
912

1013
/// Holds logic to parse and return results of type `NetworkRequestResult`.
1114
public extension NetworkRequest {

Sources/SwiftTrader/Network/NetworkRequest/NetworkRequestProtocol.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
//
77

88
import Foundation
9+
#if canImport(FoundationNetworking)
10+
import FoundationNetworking
11+
#endif
912

1013
public typealias NetworkRequestResult = Result<Decodable, NetworkRequestError>
1114

Sources/SwiftTrader/SwiftTrader.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ public extension SwiftTrader {
3030
switch await request.execute() {
3131
case .success(let model):
3232
guard let accountOverview = model as? KucoinFuturesAccountOverviewResponse else {
33-
let modelString = model.toString()
34-
return .failure(.unexpectedResponse(modelString: modelString))
33+
return .failure(.unexpectedResponse(modelString: "\(model)"))
3534
}
3635
return .success(accountOverview)
3736
case .failure(let error):

0 commit comments

Comments
 (0)