Adds ResultOperation.localizedFailure

This commit is contained in:
nythepegasus
2024-05-06 02:41:57 -04:00
committed by ny
parent 459e378522
commit 775167415a

View File

@@ -12,7 +12,10 @@ import Roxas
class ResultOperation<ResultType>: Operation class ResultOperation<ResultType>: Operation
{ {
var resultHandler: ((Result<ResultType, Error>) -> Void)? var resultHandler: ((Result<ResultType, Error>) -> Void)?
// Should only be set by subclasses
var localizedFailure: String?
@available(*, unavailable) @available(*, unavailable)
override func finish() override func finish()
{ {
@@ -22,16 +25,20 @@ class ResultOperation<ResultType>: Operation
func finish(_ result: Result<ResultType, Error>) func finish(_ result: Result<ResultType, Error>)
{ {
guard !self.isFinished else { return } guard !self.isFinished else { return }
var result = result
if self.isCancelled if self.isCancelled
{ {
self.resultHandler?(.failure(OperationError.cancelled)) result = .failure(OperationError.cancelled)
} }
else else if case .failure(let nsError as NSError) = result, let localizedFailure, nsError.localizedFailure == nil {
{ // Error doesn't have its own localizedFailure, so we give it the Operation's (if it exists)
self.resultHandler?(result) let error = nsError.withLocalizedFailure(localizedFailure)
result = .failure(error)
} }
self.resultHandler?(result)
super.finish() super.finish()
} }
} }