Skip to content

Commit 4fba683

Browse files
Merge pull request #3 from SwiftPackageIndex/change-retry-error
Change retry error
2 parents 88179ba + 44b5fcd commit 4fba683

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

Sources/Retry/Retry.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ import Foundation
1616

1717

1818
public enum Retry {
19-
public enum Error: Swift.Error, Equatable {
20-
case retryLimitExceeded(lastError: String?)
19+
public enum Error: Swift.Error {
20+
case abort(with: Swift.Error)
21+
case retryLimitExceeded(lastError: Swift.Error? = nil)
2122
}
2223

2324
public static func backedOffDelay(baseDelay: Double, attempt: Int) -> UInt32 {
@@ -32,16 +33,18 @@ public enum Retry {
3233
_ block: () throws -> T) throws -> T {
3334
var retriesLeft = retries
3435
var currentTry = 1
35-
var lastError: String?
36+
var lastError: Swift.Error?
3637
while true {
3738
if currentTry > 1 {
3839
logger.onStartOfRetry(label: label, attempt: currentTry)
3940
}
4041
do {
4142
return try block()
43+
} catch let Error.abort(with: error) {
44+
throw Error.abort(with: error)
4245
} catch {
4346
logger.onError(label: label, error: error)
44-
lastError = "\(error)"
47+
lastError = error
4548
guard retriesLeft > 0 else { break }
4649
let delay = backedOffDelay(baseDelay: delay, attempt: currentTry)
4750
logger.onStartOfDelay(label: label, delay: Double(delay))
@@ -61,16 +64,18 @@ public enum Retry {
6164
_ block: () async throws -> T) async throws -> T {
6265
var retriesLeft = retries
6366
var currentTry = 1
64-
var lastError: String?
67+
var lastError: Swift.Error?
6568
while true {
6669
if currentTry > 1 {
6770
logger.onStartOfRetry(label: label, attempt: currentTry)
6871
}
6972
do {
7073
return try await block()
74+
} catch let Error.abort(with: error) {
75+
throw Error.abort(with: error)
7176
} catch {
7277
logger.onError(label: label, error: error)
73-
lastError = "\(error)"
78+
lastError = error
7479
guard retriesLeft > 0 else { break }
7580
let delay = backedOffDelay(baseDelay: delay, attempt: currentTry)
7681
logger.onStartOfDelay(label: label, delay: Double(delay))

Tests/RetryTests/RetryTests.swift

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,45 @@ final class RetryTests: XCTestCase {
6060
}
6161

6262
// MUT
63-
XCTAssertThrowsError(
63+
do {
6464
try Retry.attempt("", delay: 0, retries: 3) {
6565
called += 1
6666
throw Error()
6767
}
68-
69-
) { error in
70-
XCTAssertEqual(error as? Retry.Error, .retryLimitExceeded(lastError: "test error"))
68+
XCTFail("expected an error to be thrown")
69+
} catch let Retry.Error.retryLimitExceeded(lastError: .some(error)) {
70+
XCTAssertEqual("\(error)", "test error")
71+
} catch {
72+
XCTFail("unexpected error: \(error)")
7173
}
7274

7375
// validation
7476
XCTAssertEqual(called, 4)
7577
}
7678

79+
func test_attempt_abort() throws {
80+
var called = 0
81+
struct Error: Swift.Error, CustomStringConvertible {
82+
var description: String { "test error" }
83+
}
84+
85+
// MUT
86+
do {
87+
try Retry.attempt("", delay: 0, retries: 3) {
88+
called += 1
89+
throw Retry.Error.abort(with: Error())
90+
}
91+
XCTFail("expected an error to be thrown")
92+
} catch let Retry.Error.abort(with: error) {
93+
XCTAssertEqual("\(error)", "test error")
94+
} catch {
95+
XCTFail("unexpected error: \(error)")
96+
}
97+
98+
// validation
99+
XCTAssertEqual(called, 1)
100+
}
101+
77102
func test_attempt_async() async throws {
78103
func dummyAsyncFunction() async { }
79104
var called = 0

0 commit comments

Comments
 (0)