Skip to content

Commit

Permalink
Implement error Hook for Traits
Browse files Browse the repository at this point in the history
  • Loading branch information
lucas34 authored and kzaher committed Dec 27, 2017
1 parent 47e3d7e commit c21a302
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file.
* Adds Reactive wrapper for `UIStepper.stepValue` property. #1389
* Adds `materialize()` operator for RxBlocking's `BlockingObservable`. #1383
* Adds `first` operator to `ObservableType`.
* Adds error handling Hook to Single, Maybe and Completable #1532

#### Anomalies

Expand Down
16 changes: 15 additions & 1 deletion RxSwift/Traits/Completable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
// Copyright © 2017 Krunoslav Zaher. All rights reserved.
//

#if DEBUG
import Foundation
#endif

/// Sequence containing 0 elements
public enum CompletableTrait { }
/// Represents a push style sequence containing 0 elements.
Expand Down Expand Up @@ -75,10 +79,20 @@ public extension PrimitiveSequenceType where TraitType == CompletableTrait, Elem
- returns: Subscription object used to unsubscribe from the observable sequence.
*/
public func subscribe(onCompleted: (() -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable {
#if DEBUG
let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : []
#else
let callStack = [String]()
#endif

return self.primitiveSequence.subscribe { event in
switch event {
case .error(let error):
onError?(error)
if let onError = onError {
onError(error)
} else {
Hooks.defaultErrorHandler(callStack, error)
}
case .completed:
onCompleted?()
}
Expand Down
16 changes: 15 additions & 1 deletion RxSwift/Traits/Maybe.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
// Copyright © 2017 Krunoslav Zaher. All rights reserved.
//

#if DEBUG
import Foundation
#endif

/// Sequence containing 0 or 1 elements
public enum MaybeTrait { }
/// Represents a push style sequence containing 0 or 1 element.
Expand Down Expand Up @@ -84,12 +88,22 @@ public extension PrimitiveSequenceType where TraitType == MaybeTrait {
public func subscribe(onSuccess: ((ElementType) -> Void)? = nil,
onError: ((Swift.Error) -> Void)? = nil,
onCompleted: (() -> Void)? = nil) -> Disposable {
#if DEBUG
let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : []
#else
let callStack = [String]()
#endif

return self.primitiveSequence.subscribe { event in
switch event {
case .success(let element):
onSuccess?(element)
case .error(let error):
onError?(error)
if let onError = onError {
onError(error)
} else {
Hooks.defaultErrorHandler(callStack, error)
}
case .completed:
onCompleted?()
}
Expand Down
16 changes: 15 additions & 1 deletion RxSwift/Traits/Single.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
// Copyright © 2017 Krunoslav Zaher. All rights reserved.
//

#if DEBUG
import Foundation
#endif

/// Sequence containing exactly 1 element
public enum SingleTrait { }
/// Represents a push style sequence containing 1 element.
Expand Down Expand Up @@ -77,12 +81,22 @@ extension PrimitiveSequenceType where TraitType == SingleTrait {
- returns: Subscription object used to unsubscribe from the observable sequence.
*/
public func subscribe(onSuccess: ((ElementType) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable {
#if DEBUG
let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : []
#else
let callStack = [String]()
#endif

return self.primitiveSequence.subscribe { event in
switch event {
case .success(let element):
onSuccess?(element)
case .error(let error):
onError?(error)
if let onError = onError {
onError(error)
} else {
Hooks.defaultErrorHandler(callStack, error)
}
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions Sources/AllTestz/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,7 @@ final class CompletableTest_ : CompletableTest, RxTestCase {
("test_merge_collection", CompletableTest.test_merge_collection),
("test_merge_array", CompletableTest.test_merge_array),
("test_merge_variadic", CompletableTest.test_merge_variadic),
("testDefaultErrorHandler", CompletableTest.testDefaultErrorHandler),
] }
}

Expand Down Expand Up @@ -707,6 +708,7 @@ final class SingleTest_ : SingleTest, RxTestCase {
("test_flatMap", SingleTest.test_flatMap),
("test_zip_tuple", SingleTest.test_zip_tuple),
("test_zip_resultSelector", SingleTest.test_zip_resultSelector),
("testDefaultErrorHandler", SingleTest.testDefaultErrorHandler),
] }
}

Expand Down Expand Up @@ -1276,6 +1278,7 @@ final class MaybeTest_ : MaybeTest, RxTestCase {
("test_flatMap", MaybeTest.test_flatMap),
("test_zip_tuple", MaybeTest.test_zip_tuple),
("test_zip_resultSelector", MaybeTest.test_zip_resultSelector),
("testDefaultErrorHandler", MaybeTest.testDefaultErrorHandler),
("testZip2_selector", MaybeTest.testZip2_selector),
("testZip2_tuple", MaybeTest.testZip2_tuple),
("testZip3_selector", MaybeTest.testZip3_selector),
Expand Down
23 changes: 23 additions & 0 deletions Tests/RxSwiftTests/CompletableTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,29 @@ extension CompletableTest {
}
}

extension CompletableTest {
func testDefaultErrorHandler() {
var loggedErrors = [TestError]()

_ = Completable.error(testError).subscribe()
XCTAssertEqual(loggedErrors, [])

let originalErrorHandler = Hooks.defaultErrorHandler

Hooks.defaultErrorHandler = { _, error in
loggedErrors.append(error as! TestError)
}

_ = Completable.error(testError).subscribe()
XCTAssertEqual(loggedErrors, [testError])

Hooks.defaultErrorHandler = originalErrorHandler

_ = Completable.error(testError).subscribe()
XCTAssertEqual(loggedErrors, [testError])
}
}

extension Never: Equatable {

}
Expand Down
24 changes: 24 additions & 0 deletions Tests/RxSwiftTests/MaybeTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -615,4 +615,28 @@ extension MaybeTest {
}
}

extension MaybeTest {
func testDefaultErrorHandler() {
var loggedErrors = [TestError]()

_ = Maybe<Int>.error(testError).subscribe()
XCTAssertEqual(loggedErrors, [])

let originalErrorHandler = Hooks.defaultErrorHandler

Hooks.defaultErrorHandler = { _, error in
loggedErrors.append(error as! TestError)
}

_ = Maybe<Int>.error(testError).subscribe()
XCTAssertEqual(loggedErrors, [testError])

Hooks.defaultErrorHandler = originalErrorHandler

_ = Maybe<Int>.error(testError).subscribe()
XCTAssertEqual(loggedErrors, [testError])
}
}



23 changes: 23 additions & 0 deletions Tests/RxSwiftTests/SingleTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -563,3 +563,26 @@ extension SingleTest {
])
}
}

extension SingleTest {
func testDefaultErrorHandler() {
var loggedErrors = [TestError]()

_ = Single<Int>.error(testError).subscribe()
XCTAssertEqual(loggedErrors, [])

let originalErrorHandler = Hooks.defaultErrorHandler

Hooks.defaultErrorHandler = { _, error in
loggedErrors.append(error as! TestError)
}

_ = Single<Int>.error(testError).subscribe()
XCTAssertEqual(loggedErrors, [testError])

Hooks.defaultErrorHandler = originalErrorHandler

_ = Single<Int>.error(testError).subscribe()
XCTAssertEqual(loggedErrors, [testError])
}
}

0 comments on commit c21a302

Please sign in to comment.