ZipponDB/src/entityWriter.zig
MrBounty e7056efec9 Now query with relationship will write the UUID bytes betwen {|<>|}
So then I can parse the file again, create a map of UUID sub json and
just iterate over the first json looking for UUID and update with new
data from map
2024-12-20 22:29:02 +01:00

100 lines
4.4 KiB
Zig

const std = @import("std");
const utils = @import("stuffs/utils.zig");
const zid = @import("ZipponData");
const AdditionalData = @import("stuffs/additionalData.zig").AdditionalData;
const dtype = @import("dtype");
const DataType = dtype.DataType;
const DateTime = dtype.DateTime;
const UUID = dtype.UUID;
const ZipponError = @import("stuffs/errors.zig").ZipponError;
// TODO: Try std.json
pub const EntityWriter = struct {
pub fn writeEntityTable(
writer: anytype,
row: []zid.Data,
additional_data: *AdditionalData,
data_types: []const DataType,
) !void {
try writer.writeAll("| ");
for (additional_data.childrens.items) |member| {
try writeValue(writer, row[member.index], data_types[member.index]);
try writer.writeAll(" \t| ");
}
try writer.writeByte('\n');
}
pub fn writeEntityJSON(
writer: anytype,
row: []zid.Data,
additional_data: *AdditionalData,
data_types: []const DataType,
) !void {
try writer.writeByte('{');
for (additional_data.childrens.items) |member| {
try writer.print("{s}: ", .{member.name});
try writeValue(writer, row[member.index], data_types[member.index]);
try writer.writeAll(", ");
}
try writer.writeAll("}, ");
}
fn writeValue(writer: anytype, value: zid.Data, data_type: DataType) !void {
switch (value) {
.Float => |v| try writer.print("{d}", .{v}),
.Int => |v| try writer.print("{d}", .{v}),
.Str => |v| try writer.print("\"{s}\"", .{v}),
.UUID => |v| {
const uuid = try UUID.parse("00000000-0000-0000-0000-000000000000"); // Maybe pass that comptime to prevent parsing it everytime
if (!std.meta.eql(v, uuid.bytes)) {
try writer.print("\"{{|<{s}>|}}\"", .{v});
} else {
try writer.print("{{}}", .{});
}
},
.Bool => |v| try writer.print("{any}", .{v}),
.Unix => |v| {
const datetime = DateTime.initUnix(v);
try writer.writeByte('"');
switch (data_type) {
.date => try datetime.format("YYYY/MM/DD", writer),
.time => try datetime.format("HH:mm:ss.SSSS", writer),
.datetime => try datetime.format("YYYY/MM/DD-HH:mm:ss.SSSS", writer),
else => unreachable,
}
try writer.writeByte('"');
},
.IntArray, .FloatArray, .StrArray, .UUIDArray, .BoolArray, .UnixArray => try writeArray(writer, value, data_type),
}
}
fn writeArray(writer: anytype, data: zid.Data, data_type: DataType) ZipponError!void {
writer.writeByte('[') catch return ZipponError.WriteError;
var iter = zid.ArrayIterator.init(data) catch return ZipponError.ZipponDataError;
switch (data) {
.IntArray => while (iter.next()) |v| writer.print("{d}, ", .{v.Int}) catch return ZipponError.WriteError,
.FloatArray => while (iter.next()) |v| writer.print("{d}", .{v.Float}) catch return ZipponError.WriteError,
.StrArray => while (iter.next()) |v| writer.print("\"{s}\"", .{v.Str}) catch return ZipponError.WriteError,
.UUIDArray => while (iter.next()) |v| writer.print("\"{s}\"", .{UUID.format_bytes(v.UUID)}) catch return ZipponError.WriteError,
.BoolArray => while (iter.next()) |v| writer.print("{any}", .{v.Bool}) catch return ZipponError.WriteError,
.UnixArray => {
while (iter.next()) |v| {
const datetime = DateTime.initUnix(v.Unix);
writer.writeByte('"') catch return ZipponError.WriteError;
switch (data_type) {
.date => datetime.format("YYYY/MM/DD", writer) catch return ZipponError.WriteError,
.time => datetime.format("HH:mm:ss.SSSS", writer) catch return ZipponError.WriteError,
.datetime => datetime.format("YYYY/MM/DD-HH:mm:ss.SSSS", writer) catch return ZipponError.WriteError,
else => unreachable,
}
writer.writeAll("\", ") catch return ZipponError.WriteError;
}
},
else => unreachable,
}
writer.writeByte(']') catch return ZipponError.WriteError;
}
};