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
100 lines
4.4 KiB
Zig
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;
|
|
}
|
|
};
|