Skip to content

Commit f7f1cf8

Browse files
committed
Allow CSVWriter escapingScalar to be disabled
1 parent fec1fa2 commit f7f1cf8

2 files changed

Lines changed: 21 additions & 6 deletions

File tree

Sources/Active/Writer/Writer.swift

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,28 +181,36 @@ extension CSVWriter {
181181
var result: [Unicode.Scalar]
182182

183183
if field.isEmpty {
184-
result = .init(repeating: escapingScalar, count: 2)
184+
if let escapingScalar = escapingScalar {
185+
result = .init(repeating: escapingScalar, count: 2)
186+
} else {
187+
result = []
188+
}
185189
} else {
186190
let input: [Unicode.Scalar] = .init(field.unicodeScalars)
187191
result = .init()
188192
result.reserveCapacity(input.count + 2)
189-
var (index, needsEscaping) = (0, false)
193+
var index = 0
194+
var needsEscaping: Unicode.Scalar?
190195

191196
while index < input.endIndex {
192197
let scalar = input[index]
193198

194199
if scalar == escapingScalar {
195-
needsEscaping = true
200+
needsEscaping = scalar
196201
} else if self.isFieldDelimiter(input, &index, &result) || self.isRowDelimiter(input, &index, &result) {
197-
needsEscaping = true
202+
needsEscaping = scalar
198203
continue
199204
}
200205

201206
index += 1
202207
result.append(scalar)
203208
}
204209

205-
if needsEscaping {
210+
if let needsEscaping = needsEscaping {
211+
guard let escapingScalar = escapingScalar else {
212+
throw Error.unescapedDelimiter(needsEscaping)
213+
}
206214
result.insert(escapingScalar, at: result.startIndex)
207215
result.append(escapingScalar)
208216
}
@@ -220,6 +228,13 @@ extension CSVWriter {
220228
}
221229

222230
fileprivate extension CSVWriter.Error {
231+
static func unescapedDelimiter(_ delimiter: Unicode.Scalar) -> CSVError<CSVWriter> {
232+
.init(.invalidInput,
233+
reason: "A field cannot include a delimiter if escaping strategy is disabled.",
234+
help: "Remove delimiter from field or set an escaping strategy.",
235+
userInfo: ["Invalid character": delimiter])
236+
237+
}
223238
/// Error raised when the a field is trying to be writen and it overflows the expected number of fields per row.
224239
static func fieldOverflow(expectedFields: Int) -> CSVError<CSVWriter> {
225240
.init(.invalidOperation,

Sources/Active/Writer/WriterConfiguration.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ extension CSVWriter {
5353
/// Boolean indicating whether the received CSV contains a header row or not.
5454
let headers: [String]
5555
/// The unicode scalar used as encapsulator and escaping character (when printed two times).
56-
let escapingScalar: Unicode.Scalar = "\""
56+
let escapingScalar: Unicode.Scalar? = "\""
5757
/// The encoding used to identify the underlying data.
5858
let encoding: String.Encoding
5959

0 commit comments

Comments
 (0)