Add CSV.init with UnicodeCodec
This commit is contained in:
parent
0718eab0bb
commit
26b4bd153a
|
@ -54,6 +54,18 @@ public struct CSV: IteratorProtocol, Sequence {
|
|||
}
|
||||
}
|
||||
|
||||
public init<T: UnicodeCodec where T.CodeUnit == UInt8>(
|
||||
stream: InputStream,
|
||||
codecType: T.Type,
|
||||
hasHeaderRow: Bool = defaultHasHeaderRow,
|
||||
delimiter: UnicodeScalar = defaultDelimiter)
|
||||
throws
|
||||
{
|
||||
let reader = BinaryReader(stream: stream, encoding: .utf8, closeOnDeinit: true)
|
||||
var iterator = UnicodeIterator(input: reader.makeUInt8Iterator(), inputEncoding: codecType)
|
||||
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
|
||||
}
|
||||
|
||||
/**
|
||||
Create CSV instance with `NSInputStream`.
|
||||
|
||||
|
@ -75,18 +87,18 @@ public struct CSV: IteratorProtocol, Sequence {
|
|||
case String.Encoding.utf32,
|
||||
String.Encoding.utf32BigEndian,
|
||||
String.Encoding.utf32LittleEndian:
|
||||
var iterator = UTF32Iterator(reader: reader)
|
||||
var iterator = UnicodeIterator(input: reader.makeUInt32Iterator(), inputEncoding: UTF32.self)
|
||||
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
|
||||
|
||||
case String.Encoding.utf16,
|
||||
String.Encoding.utf16BigEndian,
|
||||
String.Encoding.utf16LittleEndian:
|
||||
var iterator = UTF16Iterator(reader: reader)
|
||||
var iterator = UnicodeIterator(input: reader.makeUInt16Iterator(), inputEncoding: UTF16.self)
|
||||
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
|
||||
|
||||
case String.Encoding.utf8,
|
||||
String.Encoding.ascii:
|
||||
var iterator = UTF8Iterator(reader: reader)
|
||||
var iterator = UnicodeIterator(input: reader.makeUInt8Iterator(), inputEncoding: UTF8.self)
|
||||
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
|
||||
|
||||
default:
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
/*
|
||||
internal struct UnicodeIterator<
|
||||
Input: IteratorProtocol,
|
||||
InputEncoding: UnicodeCodec
|
||||
|
@ -32,61 +31,3 @@ internal struct UnicodeIterator<
|
|||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
public struct UTF32Iterator: IteratorProtocol {
|
||||
|
||||
private var innerIterator: BinaryReader.UInt32Iterator
|
||||
private var codec = UTF32()
|
||||
|
||||
internal init(reader: BinaryReader) {
|
||||
self.innerIterator = reader.makeUInt32Iterator()
|
||||
}
|
||||
|
||||
public mutating func next() -> UnicodeScalar? {
|
||||
switch codec.decode(&innerIterator) {
|
||||
case .scalarValue(let c): return c
|
||||
case .emptyInput: return nil
|
||||
case .error: return nil
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public struct UTF16Iterator: IteratorProtocol {
|
||||
|
||||
private var innerIterator: BinaryReader.UInt16Iterator
|
||||
private var codec = UTF16()
|
||||
|
||||
internal init(reader: BinaryReader) {
|
||||
self.innerIterator = reader.makeUInt16Iterator()
|
||||
}
|
||||
|
||||
public mutating func next() -> UnicodeScalar? {
|
||||
switch codec.decode(&innerIterator) {
|
||||
case .scalarValue(let c): return c
|
||||
case .emptyInput: return nil
|
||||
case .error: return nil
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public struct UTF8Iterator: IteratorProtocol {
|
||||
|
||||
private var innerIterator: BinaryReader.UInt8Iterator
|
||||
private var codec = UTF8()
|
||||
|
||||
internal init(reader: BinaryReader) {
|
||||
self.innerIterator = reader.makeUInt8Iterator()
|
||||
}
|
||||
|
||||
public mutating func next() -> UnicodeScalar? {
|
||||
switch codec.decode(&innerIterator) {
|
||||
case .scalarValue(let c): return c
|
||||
case .emptyInput: return nil
|
||||
case .error: return nil
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue