// Input.swift
// This file is part of KeePass.swift
//
// Copyright © 2021 Maxime Epain. All rights reserved.
//
// KeePass.swift 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.
//
// KeePass.swift 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 KeePass.swift. 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: LosslessBytesConvertible {
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
}
}