mirror of
https://github.com/gosticks/SwiftGit2.git
synced 2026-10-05 23:07:00 +00:00
Fix error handling when aggregating an array of Results
The previous implementation never handled failure properly and would crash when attempting to force-unwrap a nonexistent success value.
This commit is contained in:
+17
-10
@@ -361,11 +361,7 @@ public final class Repository {
|
||||
git_strarray_free(pointer)
|
||||
pointer.deallocate()
|
||||
|
||||
let error = remotes.reduce(nil) { $0 == nil ? $0 : $1.error }
|
||||
if let error = error {
|
||||
return Result.failure(error)
|
||||
}
|
||||
return Result.success(remotes.map { $0.value! })
|
||||
return remotes.aggregateResult()
|
||||
}
|
||||
|
||||
private func remoteLookup<A>(named name: String, _ callback: (Result<OpaquePointer, NSError>) -> A) -> A {
|
||||
@@ -431,11 +427,7 @@ public final class Repository {
|
||||
git_strarray_free(pointer)
|
||||
pointer.deallocate()
|
||||
|
||||
let error = references.reduce(nil) { $0 == nil ? $0 : $1.error }
|
||||
if let error = error {
|
||||
return Result.failure(error)
|
||||
}
|
||||
return Result.success(references.map { $0.value! })
|
||||
return references.aggregateResult()
|
||||
}
|
||||
|
||||
/// Load the reference with the given long name (e.g. "refs/heads/master")
|
||||
@@ -951,3 +943,18 @@ public final class Repository {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private extension Array {
|
||||
func aggregateResult<Value, Error>() -> Result<[Value], Error> where Element == Result<Value, Error> {
|
||||
var values: [Value] = []
|
||||
for result in self {
|
||||
switch result {
|
||||
case .success(let value):
|
||||
values.append(value)
|
||||
case .failure(let error):
|
||||
return .failure(error)
|
||||
}
|
||||
}
|
||||
return .success(values)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user