Skip to content

Commit 3e73f3d

Browse files
committed
Add configuration for setting escaping strategy
1 parent f7f1cf8 commit 3e73f3d

2 files changed

Lines changed: 16 additions & 8 deletions

File tree

Sources/Active/Writer/WriterConfiguration.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ extension CSVWriter {
33
public struct Configuration {
44
/// The field and row delimiters.
55
public var delimiters: Delimiter.Pair
6+
/// The strategy for escaping quoted fields.
7+
public var escapingStrategy: Strategy.Escaping
68
/// The row of headers to write at the beginning of the CSV data.
79
///
810
/// If empty, no row will be written.
@@ -19,6 +21,7 @@ extension CSVWriter {
1921
/// Designated initlaizer setting the default values.
2022
public init() {
2123
self.delimiters = (field: ",", row: "\n")
24+
self.escapingStrategy = .doubleQuote
2225
self.headers = .init()
2326
self.encoding = nil
2427
self.bomStrategy = .convention
@@ -53,7 +56,7 @@ extension CSVWriter {
5356
/// Boolean indicating whether the received CSV contains a header row or not.
5457
let headers: [String]
5558
/// The unicode scalar used as encapsulator and escaping character (when printed two times).
56-
let escapingScalar: Unicode.Scalar? = "\""
59+
let escapingScalar: Unicode.Scalar?
5760
/// The encoding used to identify the underlying data.
5861
let encoding: String.Encoding
5962

@@ -71,6 +74,7 @@ extension CSVWriter {
7174
self.delimiters = (.init(field), .init(row))
7275
}
7376
// 2. Copy all other values.
77+
self.escapingScalar = configuration.escapingStrategy.scalar
7478
self.headers = configuration.headers
7579
self.encoding = encoding
7680
}

Tests/CodableCSVTests/ActiveTests/WriterTests.swift

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ extension WriterTests {
4949
// The configuration values to be tested.
5050
let rowDelimiters: [Delimiter.Row] = ["\n", "\r", "\r\n", "**~**"]
5151
let fieldDelimiters: [Delimiter.Field] = [",", ";", "\t", "|", "||", "|-|"]
52+
let escapingStrategy: [Strategy.Escaping] = [.none, .doubleQuote]
5253
let encodings: [String.Encoding] = [.utf8, .utf16LittleEndian, .utf16BigEndian, .utf16LittleEndian, .utf32BigEndian]
5354
// The data used for testing.
5455
let headers = TestData.headers
@@ -69,13 +70,16 @@ extension WriterTests {
6970
let pair: Delimiter.Pair = (f, r)
7071
let sample = TestData.toCSV(input, delimiters: pair)
7172

72-
for encoding in encodings {
73-
var c = CSVWriter.Configuration()
74-
c.delimiters = pair
75-
c.headers = headers
76-
c.encoding = encoding
77-
c.bomStrategy = .never
78-
try work(c, sample)
73+
for escaping in escapingStrategy {
74+
for encoding in encodings {
75+
var c = CSVWriter.Configuration()
76+
c.delimiters = pair
77+
c.escapingStrategy = escaping
78+
c.headers = headers
79+
c.encoding = encoding
80+
c.bomStrategy = .never
81+
try work(c, sample)
82+
}
7983
}
8084
}
8185
}

0 commit comments

Comments
 (0)