// Input.swift
// This file is part of MiKee.
//
// Copyright © 2019 Maxime Epain. All rights reserved.
//
// MiKee is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// MiKee is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with MiKee. If not, see .
import Foundation
public class Input {
public let bytes: Bytes
public private(set) var offset = 0
public var remaining: Bytes {
bytes.suffix(from: offset)
}
public var hasBytesAvailable: Bool { stream.hasBytesAvailable }
private let stream: InputStream
public init(bytes: Bytes) {
self.bytes = bytes
let data = Data(bytes.rawValue)
stream = InputStream(data: data)
stream.open()
}
deinit {
stream.close()
}
public func read(lenght: Int) throws -> Bytes {
var out = Bytes(lenght: lenght)
let count = stream.read(&out.rawValue, maxLength: lenght)
if let error = stream.streamError { throw error }
offset += count
return out.prefix(count)
}
public func read(lenght: Int) throws -> T where T: BytesRepresentable {
let bytes = try read(lenght: lenght)
return try T(bytes)
}
public func read() throws -> T where T: Readable {
return try T(from: self)
}
public func read(maxLenght: Int) throws -> [T] where T: Readable {
var array = [T]()
var count = 0
while count < maxLenght {
array.append(try read() as T)
count += 1
}
return array
}
}