78 lines
2.9 KiB
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 }));
|
|
}
|