Skip to content

Commit 144d7cd

Browse files
author
Fernando Fernandes
committed
Add swift-log
1 parent 6c21bff commit 144d7cd

File tree

8 files changed

+146
-17
lines changed

8 files changed

+146
-17
lines changed

Package.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@ let package = Package(
1515
],
1616
dependencies: [
1717
// [Server-side Support] SwiftCrypto is a Linux-compatible port of Apple's CryptoKit library.
18-
.package(url: "https://github.com/apple/swift-crypto.git", from: "2.0.0")
18+
.package(url: "https://github.com/apple/swift-crypto.git", from: "2.0.0"),
19+
.package(url: "https://github.com/apple/swift-log.git", from: "1.0.0")
1920
],
2021
targets: [
2122
.target(
2223
name: "SwiftTrader",
2324
dependencies: [
24-
.product(name: "Crypto", package: "swift-crypto")
25+
.product(name: "Crypto", package: "swift-crypto"),
26+
.product(name: "Logging", package: "swift-log")
2527
]
2628
),
2729
.testTarget(
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//
2+
// SwiftTraderLogger.swift
3+
//
4+
//
5+
// Created by Fernando Fernandes on 03.02.22.
6+
//
7+
8+
import Foundation
9+
import Logging
10+
11+
/// Logs information via Apple's `swift-log` package.
12+
public struct SwiftTraderLogger {
13+
14+
// MARK: Properties
15+
16+
var isLoggingEnabled: Bool
17+
18+
// MARK: - Private Properties
19+
20+
private let logger: Logger
21+
22+
// MARK: - Lifecycle
23+
24+
public init(label: String, isLoggingEnabled: Bool) {
25+
self.logger = Logger(label: label)
26+
self.isLoggingEnabled = isLoggingEnabled
27+
}
28+
}
29+
30+
// MARK: - Interface
31+
32+
public extension SwiftTraderLogger {
33+
34+
func log(level: Logger.Level = .info, message: @autoclosure () -> Logger.Message, isFlush: Bool) {
35+
guard isLoggingEnabled else {
36+
return
37+
}
38+
logger.log(level: level, message())
39+
40+
// [Server-side support] (Vapor)
41+
// Refer to https://github.com/vapor/vapor/issues/796
42+
if isFlush {
43+
fflush(stdout)
44+
}
45+
}
46+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// SwiftTraderSettingsProtocol.swift
3+
//
4+
//
5+
// Created by Fernando Fernandes on 03.02.22.
6+
//
7+
8+
import Foundation
9+
10+
/// Conform to this protocol to provide/tweak default package settings.
11+
public protocol SwiftTraderSettings {
12+
var networkRequestSettings: NetworkRequestSettings { get }
13+
}
14+
15+
/// The default conformance/values of the `SwiftTraderSettings` protocol.
16+
public struct DefaultSwiftTraderSettings: SwiftTraderSettings {
17+
18+
// MARK: - Properties
19+
20+
public var networkRequestSettings: NetworkRequestSettings
21+
22+
// MARK: - Lifecycle
23+
24+
public init(networkRequestSettings: NetworkRequestSettings = DefaultNetworkRequestSettings()) {
25+
self.networkRequestSettings = networkRequestSettings
26+
}
27+
}

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,18 @@ import FoundationNetworking
1414
///
1515
/// https://docs.kucoin.com/futures/#account
1616
public struct KucoinFuturesAccountOverviewRequest: NetworkRequest {
17-
17+
1818
// MARK: - Properties
1919

2020
public typealias DecodableModel = KucoinFuturesAccountOverview
2121

22+
public var logger: SwiftTraderLogger {
23+
SwiftTraderLogger(
24+
label: "swift-trader.account-overview",
25+
isLoggingEnabled: settings.isLoggingEnable
26+
)
27+
}
28+
2229
public var session: URLSession
2330

2431
public var request: URLRequest {
@@ -31,8 +38,7 @@ public struct KucoinFuturesAccountOverviewRequest: NetworkRequest {
3138
}
3239
}
3340

34-
#warning("TODO: [CONFIG] number of retries")
35-
public var numberOfRetries: Int { 3 }
41+
public var settings: NetworkRequestSettings
3642

3743
// MARK: Private
3844

@@ -45,10 +51,14 @@ public struct KucoinFuturesAccountOverviewRequest: NetworkRequest {
4551
/// Creates a new `KucoinFuturesAccountOverviewRequest` instance.
4652
///
4753
/// - Parameter session: `URLSession` instance, the default is `.shared`.
48-
public init(session: URLSession = .shared, currencySymbol: CurrencySymbol = .USDT, kucoinAuth: KucoinAuth) {
54+
public init(session: URLSession = .shared,
55+
currencySymbol: CurrencySymbol = .USDT,
56+
kucoinAuth: KucoinAuth,
57+
settings: NetworkRequestSettings) {
4958
self.session = session
5059
self.currencySymbol = currencySymbol
5160
self.kucoinAuth = kucoinAuth
61+
self.settings = settings
5262
}
5363
}
5464

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,17 @@ public extension NetworkRequest {
2828
} catch {
2929
return .failure(.invalidRequest(error: error))
3030
}
31+
logger.log(message: "req... \(req)", isFlush: false)
32+
logger.log(message: "FLUUUUSH", isFlush: true)
3133
#if os(macOS) || os(iOS)
3234
let result = await runOnApplePlatforms(request: req)
3335
switch result {
3436
case .success:
3537
return result
3638
case .failure:
37-
if attemptNumber <= numberOfRetries {
38-
#warning("TODO: [CONFIG] Wait time between attempts")
39-
// Delay the task by 2 seconds:
40-
try? await Task.sleep(nanoseconds: 2_000_000_000)
41-
#warning("TODO: logger / enable, disable via config, default is ON")
42-
print("Retrying... \(attemptNumber) of \(numberOfRetries)")
43-
fflush(stdout)
39+
if attemptNumber <= settings.numberOfRetries {
40+
logger.log(message: "Retrying... \(attemptNumber) of \(settings.numberOfRetries)", isFlush: false)
41+
try? await Task.sleep(nanoseconds: 1_000_000_000 * settings.delayBetweenRetries)
4442
return await execute(attemptNumber: attemptNumber + 1)
4543
} else {
4644
return result

Sources/SwiftTrader/Network/NetworkRequest/NetworkRequestProtocol.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@ import Foundation
99
#if canImport(FoundationNetworking)
1010
import FoundationNetworking
1111
#endif
12+
import Logging
1213

1314
public typealias NetworkRequestResult = Result<Decodable, NetworkRequestError>
1415

1516
/// Represents a generic network request composed by basic functions that make a network request possible.
1617
public protocol NetworkRequest {
1718
associatedtype DecodableModel: Decodable
19+
var logger: SwiftTraderLogger { get }
1820
var session: URLSession { get }
1921
var request: URLRequest { get throws }
20-
var numberOfRetries: Int { get }
22+
var settings: NetworkRequestSettings { get }
2123
func execute(attemptNumber: Int) async -> NetworkRequestResult
2224
func decode(_ data: Data) throws -> DecodableModel
2325
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// NetworkRequestSettings.swift
3+
//
4+
//
5+
// Created by Fernando Fernandes on 04.02.22.
6+
//
7+
8+
import Foundation
9+
10+
/// Conform to this protocol to provide/tweak default `NetworkRequest` settings.
11+
public protocol NetworkRequestSettings {
12+
13+
/// `true` to enable logging of network requests.
14+
var isLoggingEnable: Bool { get }
15+
16+
/// The number of retries of failed `NetworkRequest`s.
17+
var numberOfRetries: Int { get }
18+
19+
/// How many seconds to wait between each `NetworkRequestSettings.getter:numberOfRetries`.
20+
var delayBetweenRetries: UInt64 { get }
21+
}
22+
23+
/// The default conformance/values of the `NetworkRequestSettings` protocol.
24+
public struct DefaultNetworkRequestSettings: NetworkRequestSettings {
25+
26+
// MARK: - Properties
27+
28+
public var isLoggingEnable: Bool = true
29+
public var numberOfRetries: Int = 3
30+
public var delayBetweenRetries: UInt64 = 2
31+
32+
// MARK: - Lifecycle
33+
34+
public init() {}
35+
}

Sources/SwiftTrader/SwiftTrader.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,17 @@ public struct SwiftTrader {
1212

1313
// MARK: - Properties
1414

15-
public let kucoinAuth: KucoinAuth
15+
private let settings: SwiftTraderSettings
16+
17+
// MARK: Private
18+
19+
private let kucoinAuth: KucoinAuth
1620

1721
// MARK: - Lifecycle
1822

19-
public init(kucoinAuth: KucoinAuth) {
23+
public init(kucoinAuth: KucoinAuth, settings: SwiftTraderSettings = DefaultSwiftTraderSettings()) {
2024
self.kucoinAuth = kucoinAuth
25+
self.settings = settings
2126
}
2227
}
2328

@@ -26,7 +31,11 @@ public struct SwiftTrader {
2631
public extension SwiftTrader {
2732

2833
func kucoinFuturesAccountOverview(currencySymbol: CurrencySymbol = .USDT) async throws -> Result<KucoinFuturesAccountOverview, SwiftTraderError> {
29-
let request = KucoinFuturesAccountOverviewRequest(currencySymbol: currencySymbol, kucoinAuth: kucoinAuth)
34+
let request = KucoinFuturesAccountOverviewRequest(
35+
currencySymbol: currencySymbol,
36+
kucoinAuth: kucoinAuth,
37+
settings: settings.networkRequestSettings
38+
)
3039
switch await request.execute() {
3140
case .success(let model):
3241
guard let futuresAccountOverview = model as? KucoinFuturesAccountOverview else {

0 commit comments

Comments
 (0)