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:
Matt Rubin
2019-04-14 19:45:52 -04:00
parent 71e9b51a52
commit cd3735cd71
+17 -10
View File
@@ -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)
}
}