diff --git a/Sources/CSV/Coder/Encoder/AsyncKeyedEncoder.swift b/Sources/CSV/Coder/Encoder/AsyncKeyedEncoder.swift index 5549d8a..a906c01 100644 --- a/Sources/CSV/Coder/Encoder/AsyncKeyedEncoder.swift +++ b/Sources/CSV/Coder/Encoder/AsyncKeyedEncoder.swift @@ -8,14 +8,18 @@ final class AsyncKeyedEncoder: 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) } } diff --git a/Sources/CSV/Coder/Encoder/AsyncSingleValueEncoder.swift b/Sources/CSV/Coder/Encoder/AsyncSingleValueEncoder.swift index 2a287ed..8c0b99b 100644 --- a/Sources/CSV/Coder/Encoder/AsyncSingleValueEncoder.swift +++ b/Sources/CSV/Coder/Encoder/AsyncSingleValueEncoder.swift @@ -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(_ value: T) throws where T : Encodable { let column = self.codingPath.map { $0.stringValue }.joined(separator: ".") diff --git a/Sources/CSV/Utilities.swift b/Sources/CSV/Utilities.swift index 1bd128c..ae27150 100644 --- a/Sources/CSV/Utilities.swift +++ b/Sources/CSV/Utilities.swift @@ -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()) } }