Files
SwiftCBOR/Sources/CBORInputStream.swift

42 lines
1.2 KiB
Swift

public protocol CBORInputStream {
mutating func popByte() throws -> UInt8
mutating func popBytes(_ n: Int) throws -> ArraySlice<UInt8>
}
// FUCK: https://openradar.appspot.com/23255436
struct ArraySliceUInt8 {
var slice : ArraySlice<UInt8>
}
struct ArrayUInt8 {
var array : ArraySlice<UInt8>
}
extension ArraySliceUInt8: CBORInputStream {
mutating func popByte() throws -> UInt8 {
if slice.count < 1 { throw CBORError.unfinishedSequence }
return slice.removeFirst()
}
mutating func popBytes(_ n: Int) throws -> ArraySlice<UInt8> {
if slice.count < n { throw CBORError.unfinishedSequence }
let result = slice.prefix(n)
slice = slice.dropFirst(n)
return result
}
}
extension ArrayUInt8: CBORInputStream {
mutating func popByte() throws -> UInt8 {
guard array.count > 0 else { throw CBORError.unfinishedSequence }
return array.removeFirst()
}
mutating func popBytes(_ n: Int) throws -> ArraySlice<UInt8> {
guard array.count >= n else { throw CBORError.unfinishedSequence }
let res = array.prefix(n)
array = array.dropFirst(n)
return res
}
}