59 lines
2.2 KiB
Zig
59 lines
2.2 KiB
Zig
const std = @import("std");
|
|
const Allocator = std.mem.Allocator;
|
|
const RelationMap = @import("relationMap.zig").RelationMap;
|
|
const dtype = @import("dtype");
|
|
const DataType = dtype.DataType;
|
|
|
|
const ZipponError = @import("errors.zig").ZipponError;
|
|
|
|
/// This is the [] part
|
|
pub const AdditionalData = struct {
|
|
allocator: Allocator,
|
|
limit: usize = 0,
|
|
childrens: std.ArrayList(AdditionalDataMember),
|
|
|
|
pub fn init(allocator: Allocator) AdditionalData {
|
|
return AdditionalData{
|
|
.allocator = allocator,
|
|
.childrens = std.ArrayList(AdditionalDataMember).init(allocator),
|
|
};
|
|
}
|
|
|
|
pub fn populateWithEverythingExceptLink(self: *AdditionalData, members: [][]const u8, dtypes: []DataType) !void {
|
|
for (members, dtypes, 0..) |member, dt, i| {
|
|
if (dt == .link or dt == .link_array) continue;
|
|
try self.childrens.append(AdditionalDataMember.init(member, i));
|
|
}
|
|
}
|
|
|
|
pub fn addMember(self: *AdditionalData, name: []const u8, index: usize) ZipponError!void {
|
|
self.childrens.append(AdditionalDataMember.init(name, index)) catch return ZipponError.MemoryError;
|
|
}
|
|
|
|
pub fn initAdditionalDataOfLastChildren(self: *AdditionalData) *AdditionalData {
|
|
self.childrens.items[self.childrens.items.len - 1].additional_data = AdditionalData.init(self.allocator);
|
|
return &self.childrens.items[self.childrens.items.len - 1].additional_data.?;
|
|
}
|
|
|
|
/// Create an array of empty RelationMap based on the additionalData
|
|
pub fn relationMapArrayInit(self: AdditionalData, allocator: Allocator) ZipponError!?[]RelationMap {
|
|
// So here I should have relationship if children are relations
|
|
var array = std.ArrayList(RelationMap).init(allocator);
|
|
for (self.childrens.items) |child| {
|
|
child.
|
|
}
|
|
}
|
|
};
|
|
|
|
// This is name in: [name]
|
|
// There is an additional data because it can be [friend [1; name]]
|
|
pub const AdditionalDataMember = struct {
|
|
name: []const u8,
|
|
index: usize, // Index place in the schema
|
|
additional_data: ?AdditionalData = null,
|
|
|
|
pub fn init(name: []const u8, index: usize) AdditionalDataMember {
|
|
return AdditionalDataMember{ .name = name, .index = index };
|
|
}
|
|
};
|