import Foundation struct MoQTPayload { private(set) var data = Data() enum Error: Swift.Error { case eof case outOfRange } /// Specifies the length of buffer. var length: Int { get { data.count } set { switch true { case (data.count < newValue): data.append(Data(count: newValue - data.count)) case (newValue < data.count): data = data.subdata(in: 0.. Self { if value <= 63 { return putData(UInt8(value).bigEndian.data) } if value <= 16383 { return putData((UInt16(value) | 0x4000).bigEndian.data) } if value <= 1073741823 { return putData((UInt32(value) | 0x80000000).bigEndian.data) } return putData((UInt64(value) | 0xc000000000000000).bigEndian.data) } mutating func getInt() throws -> Int { guard 1 <= bytesAvailable else { throw Error.eof } switch Int(data[position] >> 6) { case 0: defer { position += 1 } return Int(data: data[position.. Self { putInt(value.utf8.count) putData(Data(value.utf8)) return self } mutating func getString() throws -> String { let length = try getInt() let data = try getData(length) return String(data: data, encoding: .utf8) ?? "" } mutating func putBool(_ value: Bool) -> Self { putData(Data([value ? 1 : 0])) return self } mutating func getBool() throws -> Bool { guard 1 <= bytesAvailable else { throw Error.eof } let value = try getData(1) return value[0] == 1 } @discardableResult mutating func putData(_ value: Data) -> Self { if position == data.count { data.append(value) position = data.count return self } let length = min(data.count - position, value.count) data.replaceSubrange(position.. Data { guard length <= bytesAvailable else { throw Error.eof } position += length return data.subdata(in: position - length..