Skip to content

Commit 844cc8c

Browse files
Throw error if partial errors are detected (#34)
1 parent b44db4e commit 844cc8c

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

Sources/DataConnectError.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ public enum DataConnectError: Error {
3434

3535
/// timestamp components specified to initialize Timestamp are invalid
3636
case invalidTimestampFormat
37+
38+
/// generic operation execution error
39+
case operationExecutionFailed(messages: String?)
3740
}

Sources/Internal/GrpcClient.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import SwiftProtobuf
2727
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
2828
typealias FirebaseDataConnectAsyncClient =
2929
Google_Firebase_Dataconnect_V1beta_ConnectorServiceAsyncClient
30+
typealias FirebaseDataConnectGraphqlError = Google_Firebase_Dataconnect_V1beta_GraphqlError
3031

3132
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
3233
actor GrpcClient: CustomStringConvertible {
@@ -148,7 +149,13 @@ actor GrpcClient: CustomStringConvertible {
148149
let resultsString = try results.jsonString()
149150
DataConnectLogger
150151
.debug("executeQuery() receives response: \(resultsString, privacy: .private).")
152+
151153
// Not doing error decoding here
154+
guard results.errors.isEmpty else {
155+
throw DataConnectError
156+
.operationExecutionFailed(messages: createErrorJson(errors: results.errors))
157+
}
158+
152159
if let decodedResults = try codec.decode(result: results.data, asType: resultType) {
153160
return OperationResult(data: decodedResults)
154161
} else {
@@ -191,6 +198,12 @@ actor GrpcClient: CustomStringConvertible {
191198
let resultsString = try results.jsonString()
192199
DataConnectLogger
193200
.debug("executeMutation() receives response: \(resultsString, privacy: .private).")
201+
202+
guard results.errors.isEmpty else {
203+
throw DataConnectError
204+
.operationExecutionFailed(messages: createErrorJson(errors: results.errors))
205+
}
206+
194207
if let decodedResults = try codec.decode(result: results.data, asType: resultType) {
195208
return OperationResult(data: decodedResults)
196209
} else {
@@ -206,6 +219,22 @@ actor GrpcClient: CustomStringConvertible {
206219
}
207220
}
208221

222+
private func createErrorJson(errors: [FirebaseDataConnectGraphqlError]) -> String? {
223+
var errorMessages = [String]()
224+
for err in errors {
225+
errorMessages.append(err.message)
226+
}
227+
228+
do {
229+
let jsonEncoder = JSONEncoder()
230+
let jsonData = try jsonEncoder.encode(errorMessages)
231+
return String(data: jsonData, encoding: .utf8)
232+
} catch {
233+
DataConnectLogger.error("Error encoding partial error list")
234+
return nil
235+
}
236+
}
237+
209238
func createCallOptions() async -> CallOptions {
210239
var headers = HPACKHeaders()
211240

0 commit comments

Comments
 (0)