35 lines
1.4 KiB
Zig
35 lines
1.4 KiB
Zig
const std = @import("std");
|
|
const range = @import("../utils/RangeIter.zig").range;
|
|
|
|
const readUInt = @import("./readUInt.zig").readUInt;
|
|
const readString = @import("./readString.zig").readString;
|
|
const readQVariant = @import("./readQVariant.zig").readQVariant;
|
|
const freeQVariantMap = @import("../utils/free/freeQVariantMap.zig").freeQVariantMap;
|
|
|
|
const QVariant = @import("../types/QVariant.zig").QVariant;
|
|
|
|
pub fn readQVariantMap(reader: anytype, allocator: *std.mem.Allocator) !std.StringHashMap(QVariant) {
|
|
var map = std.StringHashMap(QVariant).init(allocator);
|
|
var numItems = try readUInt(reader);
|
|
//std.debug.print("read: readQVariantMap length={d} \n", .{numItems});
|
|
|
|
var iter = range(u32, 0, numItems);
|
|
while (iter.next()) |i| {
|
|
var key = try readString(reader, allocator);
|
|
var value = try readQVariant(reader, allocator);
|
|
try map.put(key, value);
|
|
}
|
|
|
|
return map;
|
|
}
|
|
|
|
test "deserialize QVariantMap" {
|
|
var bytes = &[_]u8{ 0, 0, 0, 2, 0, 0, 0, 8, 0, 65, 0, 67, 0, 65, 0, 66, 0, 0, 0, 3, 0, 0, 0, 5, 32, 0, 0, 0, 6, 0, 111, 0, 119, 0, 111, 0, 0, 0, 1, 0, 12 };
|
|
var fBS = std.io.fixedBufferStream(bytes);
|
|
var qvariantmap = try readQVariantMap(fBS.reader(), std.testing.allocator);
|
|
defer freeQVariantMap(qvariantmap, std.testing.allocator);
|
|
|
|
try std.testing.expect(qvariantmap.get("ACAB").?.UInt == 1312);
|
|
try std.testing.expect(qvariantmap.get("owo").?.Byte == 12);
|
|
}
|