Changed Array<UInt8>.escaped property to .escaping(_:) method to handle configured cell delimiters

This commit is contained in:
Caleb Kleveter 2019-05-20 08:53:16 -05:00
parent 4b13839018
commit 266d4efac4
No known key found for this signature in database
GPG Key ID: B38DBD5CF2C98D69
3 changed files with 26 additions and 13 deletions

View File

@ -8,14 +8,18 @@ final class AsyncKeyedEncoder<K>: KeyedEncodingContainerProtocol where K: Coding
self.codingPath = path
self.encoder = encoder
}
var delimiter: UInt8? {
return self.encoder.configuration.cellDelimiter
}
func _encode(_ value: [UInt8], for key: K) {
switch self.encoder.container.section {
case .header:
let bytes = Array([[34], key.stringValue.bytes.escaped, [34]].joined())
let bytes = key.stringValue.bytes.escaping(self.delimiter)
self.encoder.container.cells.append(bytes)
case .row:
let bytes = Array([[34], value.escaped, [34]].joined())
let bytes = value.escaping(self.delimiter)
self.encoder.container.cells.append(bytes)
}
}

View File

@ -9,18 +9,22 @@ final class AsyncSingleValueEncoder: SingleValueEncodingContainer {
self.encoder = encoder
}
var delimiter: UInt8? {
return self.encoder.configuration.cellDelimiter
}
func encodeNil() throws {
let value = self.encoder.encodingOptions.nilCodingStrategy.bytes()
self.encoder.container.cells.append(value.escaped)
let value = self.encoder.encodingOptions.nilCodingStrategy.bytes().escaping(self.delimiter)
self.encoder.container.cells.append(value)
}
func encode(_ value: Bool) throws {
let value = self.encoder.encodingOptions.boolCodingStrategy.bytes(from: value)
self.encoder.container.cells.append(value.escaped)
let value = self.encoder.encodingOptions.boolCodingStrategy.bytes(from: value).escaping(self.delimiter)
self.encoder.container.cells.append(value)
}
func encode(_ value: String) throws { self.encoder.container.cells.append(value.bytes.escaped) }
func encode(_ value: Double) throws { self.encoder.container.cells.append(value.bytes.escaped) }
func encode(_ value: Float) throws { self.encoder.container.cells.append(value.bytes.escaped) }
func encode(_ value: Int) throws { self.encoder.container.cells.append(value.bytes.escaped) }
func encode(_ value: String) throws { self.encoder.container.cells.append(value.bytes.escaping(self.delimiter)) }
func encode(_ value: Double) throws { self.encoder.container.cells.append(value.bytes.escaping(self.delimiter)) }
func encode(_ value: Float) throws { self.encoder.container.cells.append(value.bytes.escaping(self.delimiter)) }
func encode(_ value: Int) throws { self.encoder.container.cells.append(value.bytes.escaping(self.delimiter)) }
func encode<T>(_ value: T) throws where T : Encodable {
let column = self.codingPath.map { $0.stringValue }.joined(separator: ".")

View File

@ -14,8 +14,13 @@ extension String {
}
extension Array where Element == UInt8 {
var escaped: [UInt8] {
return self.contains(34) ? Array(self.split(separator: 34).joined(separator: [34, 34])) : self
func escaping(_ character: UInt8?) -> [UInt8] {
guard let code = character else {
return self
}
let contents = self.contains(code) ? Array(self.split(separator: code).joined(separator: [code, code])) : self
return Array([[code], contents, [code]].joined())
}
}