1
0
Fork 0
QuasselClient/src/qtshit/write/writeQVariant.zig

78 lines
2.9 KiB
Zig

const std = @import("std");
const QVariantType = @import("../types/QVariant.zig").QVariant;
const QVariantTypeID = @import("../utils/QVariantTypeID.zig").QVariantTypeID;
const writeInt = @import("./writeInt.zig").writeInt;
const writeUInt = @import("./writeUInt.zig").writeUInt;
const writeShort = @import("./writeShort.zig").writeShort;
const writeByte = @import("./writeByte.zig").writeByte;
const writeSignedByte = @import("./writeSignedByte.zig").writeSignedByte;
const writeQByteArray = @import("./writeQByteArray.zig").writeQByteArray;
const writeString = @import("./writeString.zig").writeString;
const writeQVariantList = @import("./writeQVariantList.zig").writeQVariantList;
const writeQVariantHeader = @import("./writeQVariantHeader.zig").writeQVariantHeader;
const writeQVariantMap = @import("./writeQVariantMap.zig").writeQVariantMap;
const writeQStringList = @import("./writeQStringList.zig").writeQStringList;
const writeUserType = @import("./usertypes/writeUserType.zig").writeUserType;
pub fn writeQVariant(writer: anytype, allocator: *std.mem.Allocator, variant: QVariantType) (@TypeOf(writer).Error || std.os.WriteError || error{OutOfMemory} || error{InvalidUtf8})!void {
try writeQVariantHeader(writer, try QVariantTypeID(variant));
switch (variant) {
.Byte => |out| {
try writeByte(writer, out);
},
.Int => |out| {
try writeInt(writer, out);
},
.UInt => |out| {
try writeUInt(writer, out);
},
.QVariantMap => |out| {
try writeQVariantMap(writer, allocator, out);
},
.QVariantList => |out| {
try writeQVariantList(writer, allocator, out);
},
.String => |out| {
try writeString(writer, allocator, out);
},
.QStringList => |out| {
try writeQStringList(writer, allocator, out);
},
.QByteArray => |out| {
try writeQByteArray(writer, out);
},
.Short => |out| {
try writeShort(writer, out);
},
.QDateTime => {
@panic("Can't write QDateTime");
},
.UserType => |out| {
try writeUserType(writer, allocator, out);
},
//else => {
// @panic("Unsupported!");
//},
}
}
test "serialize QVariant Int" {
var byteList = std.ArrayList(u8).init(std.testing.allocator);
defer byteList.deinit();
try writeQVariant(byteList.writer(), std.testing.allocator, .{ .Int = 1337 });
try std.testing.expect(std.mem.eql(u8, byteList.items, &[_]u8{ 0, 0, 0, 2, 0, 0, 0, 5, 57 }));
}
test "serialize QVariant String" {
var byteList = std.ArrayList(u8).init(std.testing.allocator);
defer byteList.deinit();
try writeQVariant(byteList.writer(), std.testing.allocator, .{ .String = "ACAB" });
try std.testing.expect(std.mem.eql(u8, byteList.items, &[_]u8{ 0, 0, 0, 10, 0, 0, 0, 0, 8, 0, 65, 0, 67, 0, 65, 0, 66 }));
}