Browse Source

Add 'cause' to error description if present (#1925)

Motivation:

A description of an `RPCError`'s `cause` isn't included in its
description if present, it should be to provide more context.

Modifications:

- Add cause to the description if present

Result:

More context in errors
George Barnett 1 year ago
parent
commit
261aea9476
2 changed files with 9 additions and 1 deletions
  1. 5 1
      Sources/GRPCCore/RPCError.swift
  2. 4 0
      Tests/GRPCCoreTests/RPCErrorTests.swift

+ 5 - 1
Sources/GRPCCore/RPCError.swift

@@ -74,7 +74,11 @@ public struct RPCError: Sendable, Hashable, Error {
 
 extension RPCError: CustomStringConvertible {
   public var description: String {
-    "\(self.code): \"\(self.message)\""
+    if let cause = self.cause {
+      return "\(self.code): \"\(self.message)\" (cause: \"\(cause)\")"
+    } else {
+      return "\(self.code): \"\(self.message)\""
+    }
   }
 }
 

+ 4 - 0
Tests/GRPCCoreTests/RPCErrorTests.swift

@@ -40,6 +40,10 @@ final class RPCErrorTests: XCTestCase {
     XCTAssertDescription(RPCError(code: .dataLoss, message: ""), #"dataLoss: """#)
     XCTAssertDescription(RPCError(code: .unknown, message: "message"), #"unknown: "message""#)
     XCTAssertDescription(RPCError(code: .aborted, message: "message"), #"aborted: "message""#)
+    XCTAssertDescription(
+      RPCError(code: .aborted, message: "message", cause: CancellationError()),
+      #"aborted: "message" (cause: "CancellationError()")"#
+    )
   }
 
   func testErrorFromStatus() throws {