|
|
@@ -18,18 +18,8 @@
|
|
|
#endif
|
|
|
import Foundation // for String.Encoding
|
|
|
|
|
|
-/// An item of metadata
|
|
|
-private struct MetadataPair {
|
|
|
- var key: String
|
|
|
- var value: String
|
|
|
- init(key: String, value: String) {
|
|
|
- self.key = key
|
|
|
- self.value = value
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/// Metadata sent with gRPC messages
|
|
|
-public class Metadata: CustomStringConvertible, NSCopying {
|
|
|
+public class Metadata: CustomStringConvertible {
|
|
|
/// Pointer to underlying C representation
|
|
|
var underlyingArray: UnsafeMutableRawPointer
|
|
|
|
|
|
@@ -41,23 +31,10 @@ public class Metadata: CustomStringConvertible, NSCopying {
|
|
|
underlyingArray = cgrpc_metadata_array_create()
|
|
|
}
|
|
|
|
|
|
- public init(_ pairs: [[String: String]]) {
|
|
|
- underlyingArray = cgrpc_metadata_array_create()
|
|
|
- for pair in pairs {
|
|
|
- for key in pair.keys {
|
|
|
- if let value = pair[key] {
|
|
|
- add(key: key, value: value)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
public init(_ pairs: [String: String]) {
|
|
|
underlyingArray = cgrpc_metadata_array_create()
|
|
|
- for key in pairs.keys {
|
|
|
- if let value = pairs[key] {
|
|
|
- add(key: key, value: value)
|
|
|
- }
|
|
|
+ for (key, value) in pairs {
|
|
|
+ add(key: key, value: value)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -68,49 +45,47 @@ public class Metadata: CustomStringConvertible, NSCopying {
|
|
|
public func count() -> Int {
|
|
|
return cgrpc_metadata_array_get_count(underlyingArray)
|
|
|
}
|
|
|
-
|
|
|
- public func key(_ index: Int) -> String {
|
|
|
- if let string = cgrpc_metadata_array_copy_key_at_index(underlyingArray, index) {
|
|
|
- defer {
|
|
|
- cgrpc_free_copied_string(string)
|
|
|
- }
|
|
|
- if let key = String(cString: string, encoding: String.Encoding.utf8) {
|
|
|
- return key
|
|
|
- }
|
|
|
- }
|
|
|
- return "<binary-metadata-key>"
|
|
|
+
|
|
|
+ // Returns `nil` for non-UTF8 metadata key strings.
|
|
|
+ public func key(_ index: Int) -> String? {
|
|
|
+ // We actually know that this method will never return nil,
|
|
|
+ // so we can forcibly unwrap the result. (Also below.)
|
|
|
+ let keyData = cgrpc_metadata_array_copy_key_at_index(underlyingArray, index)!
|
|
|
+ defer { cgrpc_free_copied_string(keyData) }
|
|
|
+ return String(cString: keyData, encoding: String.Encoding.utf8)
|
|
|
}
|
|
|
-
|
|
|
- public func value(_ index: Int) -> String {
|
|
|
- if let string = cgrpc_metadata_array_copy_value_at_index(underlyingArray, index) {
|
|
|
- defer {
|
|
|
- cgrpc_free_copied_string(string)
|
|
|
- }
|
|
|
- if let value = String(cString: string, encoding: String.Encoding.utf8) {
|
|
|
- return value
|
|
|
- }
|
|
|
- }
|
|
|
- return "<binary-metadata-value>"
|
|
|
+
|
|
|
+ // Returns `nil` for non-UTF8 metadata value strings.
|
|
|
+ public func value(_ index: Int) -> String? {
|
|
|
+ // We actually know that this method will never return nil,
|
|
|
+ // so we can forcibly unwrap the result. (Also below.)
|
|
|
+ let valueData = cgrpc_metadata_array_copy_value_at_index(underlyingArray, index)!
|
|
|
+ defer { cgrpc_free_copied_string(valueData) }
|
|
|
+ return String(cString: valueData, encoding: String.Encoding.utf8)
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public func add(key: String, value: String) {
|
|
|
cgrpc_metadata_array_append_metadata(underlyingArray, key, value)
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public var description: String {
|
|
|
var result = ""
|
|
|
for i in 0..<count() {
|
|
|
let key = self.key(i)
|
|
|
let value = self.value(i)
|
|
|
- result += key + ":" + value + "\n"
|
|
|
+ result += (key ?? "(nil)") + ":" + (value ?? "(nil)") + "\n"
|
|
|
}
|
|
|
return result
|
|
|
}
|
|
|
-
|
|
|
- public func copy(with _: NSZone? = nil) -> Any {
|
|
|
+
|
|
|
+ public func copy() -> Metadata {
|
|
|
let copy = Metadata()
|
|
|
- for i in 0..<count() {
|
|
|
- copy.add(key: key(i), value: value(i))
|
|
|
+ for index in 0..<count() {
|
|
|
+ let keyData = cgrpc_metadata_array_copy_key_at_index(underlyingArray, index)!
|
|
|
+ defer { cgrpc_free_copied_string(keyData) }
|
|
|
+ let valueData = cgrpc_metadata_array_copy_value_at_index(underlyingArray, index)!
|
|
|
+ defer { cgrpc_free_copied_string(valueData) }
|
|
|
+ cgrpc_metadata_array_append_metadata(copy.underlyingArray, keyData, valueData)
|
|
|
}
|
|
|
return copy
|
|
|
}
|