From eea6b49e08f66a33711b0b957a2f404bb6397fb7 Mon Sep 17 00:00:00 2001 From: Gus Cairo Date: Fri, 31 Jan 2025 15:35:19 +0000 Subject: [PATCH] Fix Metadata's description for prettier printing (#2185) This PR changes `Metadata`'s description to include quotes around string values. From this: ``` [("some-key", some-value)] ``` to this: ``` [("some-key", "some-value")] ``` --------- Co-authored-by: George Barnett --- Sources/GRPCCore/Metadata.swift | 19 +++++++++++++++- Tests/GRPCCoreTests/MetadataTests.swift | 30 +++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/Sources/GRPCCore/Metadata.swift b/Sources/GRPCCore/Metadata.swift index dfc095e1e..23218b4a1 100644 --- a/Sources/GRPCCore/Metadata.swift +++ b/Sources/GRPCCore/Metadata.swift @@ -494,7 +494,13 @@ extension Metadata.Value: ExpressibleByArrayLiteral { extension Metadata: CustomStringConvertible { public var description: String { - String(describing: self.map({ ($0.key, $0.value) })) + if self.isEmpty { + return "[:]" + } else { + let elements = self.map { "\(String(reflecting: $0.key)): \(String(reflecting: $0.value))" } + .joined(separator: ", ") + return "[\(elements)]" + } } } @@ -508,3 +514,14 @@ extension Metadata.Value: CustomStringConvertible { } } } + +extension Metadata.Value: CustomDebugStringConvertible { + public var debugDescription: String { + switch self { + case .string(let stringValue): + return String(reflecting: stringValue) + case .binary(let binaryValue): + return String(reflecting: binaryValue) + } + } +} diff --git a/Tests/GRPCCoreTests/MetadataTests.swift b/Tests/GRPCCoreTests/MetadataTests.swift index 68c3df85c..617d2263d 100644 --- a/Tests/GRPCCoreTests/MetadataTests.swift +++ b/Tests/GRPCCoreTests/MetadataTests.swift @@ -314,4 +314,34 @@ struct MetadataTests { ) } } + + @Suite("Description") + struct Description { + let metadata: Metadata = [ + "key1": "value1", + "key2": "value2", + "key-bin": .binary([1, 2, 3]), + ] + + @Test("Metadata") + func describeMetadata() async throws { + #expect("\(self.metadata)" == #"["key1": "value1", "key2": "value2", "key-bin": [1, 2, 3]]"#) + } + + @Test("Metadata.Value") + func describeMetadataValue() async throws { + for (key, value) in self.metadata { + switch key { + case "key1": + #expect("\(value)" == "value1") + case "key2": + #expect("\(value)" == "value2") + case "key-bin": + #expect("\(value)" == "[1, 2, 3]") + default: + Issue.record("Should not have reached this point") + } + } + } + } }