A simple stream reader protocol for Swift named
StreamReader, with two
GenericStreamReader can read from any
GenericReadStream, which the
FileDescriptor (from SystemPackage),
IntputStream classes have been made to conform to.
Reading a Stream to the End
let data = ... let reader = DataReader(data: data) let readData = try reader.readDataToEnd() assert(readData == data)
Reading a Stream Until a Delimitor Is Found
let inputStream = ... let reader = InputStreamReader(stream: inputStream, bufferSize: 1024, bufferSizeIncrement: 512) /* Read the stream until a newline (whether macOS or Classic MacOS) is found, and returns the data without the newline. */ let (line, separator) = try reader.readData(upTo: [Data("\n".utf8), Data("\r".utf8)], matchingMode: .anyMatchWins, failIfNotFound: false, includeDelimiter: false) _ = try reader.readData(size: separator.count) /* We must read the line separator before next read, probably :) */
Note: In the example above, if the file has Windows new lines, this will add an
empty new line after each line (the separator for Windows being
Stream Reader has also a dedicated method to read a line in a stream:
/* Does not return the line separator, _but_ set stream position after the line separator. */ let lineData = try reader.readLine(allowUnixNewLines: true, allowLegacyMacOSNewLines: true, allowWindowsNewLines: true).line
Make the reads async? This would change a lot of things, but the core of the project should stay the same.
Or maybe just be thread-safe, idk.