@@ -15,8 +15,8 @@ public final class CSVReader: IteratorProtocol, Sequence {
1515 private( set) internal var headerLookup : [ Int : Int ] ?
1616 /// Unicode scalar buffer to keep scalars that hasn't yet been analysed.
1717 private let buffer : ScalarBuffer
18- /// The unicode scalar iterator providing all input data.
19- private let iterator : ScalarIterator
18+ /// The unicode scalar decoder providing all input data.
19+ private let decoder : ScalarDecoder
2020 /// Check whether the given unicode scalar is part of the field delimiter sequence.
2121 private let isFieldDelimiter : DelimiterChecker
2222 /// Check whether the given unicode scalar is par of the row delimiter sequence.
@@ -35,16 +35,16 @@ public final class CSVReader: IteratorProtocol, Sequence {
3535 /// Designated initializer for the CSV reader.
3636 /// - parameter configuration: Recipe detailing how to parse the CSV data (i.e. encoding, delimiters, etc.).
3737 /// - parameter buffer: A buffer storing in-flight `Unicode.Scalar`s.
38- /// - parameter iterator: An iterator providing the CSV `Unicode.Scalar`s.
38+ /// - parameter decoder: The instance providing the input `Unicode.Scalar`s.
3939 /// - throws: `CSVError<CSVReader>` exclusively.
40- internal init ( configuration: Configuration , buffer: ScalarBuffer , iterator : ScalarIterator ) throws {
40+ internal init ( configuration: Configuration , buffer: ScalarBuffer , decoder : @escaping ScalarDecoder ) throws {
4141 self . configuration = configuration
42- self . settings = try Settings ( configuration: configuration, iterator : iterator , buffer: buffer)
42+ self . settings = try Settings ( configuration: configuration, decoder : decoder , buffer: buffer)
4343 ( self . headers, self . headerLookup) = ( . init( ) , nil )
4444 self . buffer = buffer
45- self . iterator = iterator
46- self . isFieldDelimiter = CSVReader . makeMatcher ( delimiter: self . settings. delimiters. field, buffer: self . buffer, iterator : self . iterator )
47- self . isRowDelimiter = CSVReader . makeMatcher ( delimiter: self . settings. delimiters. row, buffer: self . buffer, iterator : self . iterator )
45+ self . decoder = decoder
46+ self . isFieldDelimiter = CSVReader . makeMatcher ( delimiter: self . settings. delimiters. field, buffer: self . buffer, decoder : self . decoder )
47+ self . isRowDelimiter = CSVReader . makeMatcher ( delimiter: self . settings. delimiters. row, buffer: self . buffer, decoder : self . decoder )
4848 self . count = ( 0 , 0 )
4949 self . status = . reading
5050
@@ -148,7 +148,7 @@ extension CSVReader {
148148 // 1. This loops starts a row, and then continue for every field.
149149 loop: while true {
150150 // 2. Try to retrieve a scalar (if there is none, we reached the EOF).
151- guard let scalar = try self . buffer. next ( ) ?? self . iterator . next ( ) else {
151+ guard let scalar = try self . buffer. next ( ) ?? self . decoder ( ) else {
152152 switch result. isEmpty {
153153 // 2.A. If no fields has been parsed, return nil.
154154 case true : return nil
@@ -196,7 +196,7 @@ extension CSVReader {
196196
197197 fieldLoop: while true {
198198 // Try to retrieve an scalar (if not, it is the EOF).
199- guard let scalar = try self . buffer. next ( ) ?? self . iterator . next ( ) else { reachedRowsEnd = true ; break fieldLoop }
199+ guard let scalar = try self . buffer. next ( ) ?? self . decoder ( ) else { reachedRowsEnd = true ; break fieldLoop }
200200 // There cannot be double quotes on unescaped fields. If one is encountered, an error is thrown.
201201 if scalar == self . settings. escapingScalar {
202202 throw Error . invalidUnescapedField ( rowIndex: rowIndex)
@@ -235,18 +235,18 @@ extension CSVReader {
235235
236236 fieldLoop: while true {
237237 // 1. Retrieve an scalar (if not there, it means EOF). This case is not allowed without closing the escaping field first.
238- guard let scalar = try self . buffer. next ( ) ?? self . iterator . next ( ) else { throw Error . invalidEOF ( rowIndex: rowIndex) }
238+ guard let scalar = try self . buffer. next ( ) ?? self . decoder ( ) else { throw Error . invalidEOF ( rowIndex: rowIndex) }
239239 // 2. If the retrieved scalar is not a quote (i.e. "), just store it and continue parsing.
240240 guard scalar == self . settings. escapingScalar else { field. append ( scalar) ; continue fieldLoop }
241241 // 3. If the retrieved scalar was a quote, retrieve the following scalar and check if it is EOF. If so, the field has finished and also the row and the file.
242- guard var followingScalar = try self . buffer. next ( ) ?? self . iterator . next ( ) else { reachedRowsEnd = true ; break fieldLoop }
242+ guard var followingScalar = try self . buffer. next ( ) ?? self . decoder ( ) else { reachedRowsEnd = true ; break fieldLoop }
243243 // 4. If the second retrieved scalar is another quote, the data is escaping a single quote scalar (quotes are escaped with other quotes).
244244 guard followingScalar != self . settings. escapingScalar else { field. append ( self . settings. escapingScalar) ; continue fieldLoop }
245245 // 5. Once this point is reached, the field has been properly escaped.
246246 if !self . settings. trimCharacters. isEmpty {
247247 // 6. Trim any character after the quote if necessary.
248248 while self . settings. trimCharacters. contains ( followingScalar) {
249- guard let tmpScalar = try self . buffer. next ( ) ?? self . iterator . next ( ) else {
249+ guard let tmpScalar = try self . buffer. next ( ) ?? self . decoder ( ) else {
250250 reachedRowsEnd = true
251251 break fieldLoop
252252 }
0 commit comments