Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Sources/GRPCCore/Metadata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,15 @@ public struct Metadata: Sendable, Hashable {
internal mutating func addValue(_ value: Value, forKey key: String) {
self.elements.append(.init(key: key, value: value))
}

/// Merge another instance of `Metadata` into this one.
///
/// - Parameter other: the `Metadata` which key-value pairs should be merged into this one.
public mutating func merge(_ other: Metadata) {
for (key, value) in other {
self.addValue(value, forKey: key)
}
}

/// Removes all values associated with the given key.
///
Expand Down
56 changes: 56 additions & 0 deletions Tests/GRPCCoreTests/MetadataTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -252,4 +252,60 @@ struct MetadataTests {
#expect(self.metadata == ["key1": "value1", "key3": "value1"])
}
}

@Suite("Merge")
struct Merge {
var metadata: Metadata = [
"key1": "value1-1",
"key2": "value2",
"key3": "value3",
]
var otherMetadata: Metadata = [
"key4": "value4",
"key5": "value5",
]

@Test("Where key is already present with a different value")
mutating func mergeWhereKeyIsAlreadyPresentWithDifferentValue() async throws {
self.otherMetadata.addString("value1-2", forKey: "key1")
self.metadata.merge(self.otherMetadata)

#expect(self.metadata == [
"key1": "value1-1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5",
"key1": "value1-2",
])
}

@Test("Where key is already present with same value")
mutating func mergeWhereKeyIsAlreadyPresentWithSameValue() async throws {
self.otherMetadata.addString("value1-1", forKey: "key1")
self.metadata.merge(self.otherMetadata)

#expect(self.metadata == [
"key1": "value1-1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5",
"key1": "value1-1",
])
}

@Test("Where key is not already present")
mutating func mergeWhereKeyIsNotAlreadyPresent() async throws {
self.metadata.merge(self.otherMetadata)

#expect(self.metadata == [
"key1": "value1-1",
"key2": "value2",
"key3": "value3",
"key4": "value4",
"key5": "value5"
])
}
}
}
Loading