Add better error logging and fix config parsing in newer zig versions

This commit is contained in:
ferreo 2025-01-29 19:23:24 +00:00
parent 787bd99c06
commit d887536199
3 changed files with 56 additions and 20 deletions

View File

@ -20,7 +20,10 @@ pub fn loadConf(comptime T: type, allocator: std.mem.Allocator, path: []const u8
if (bytes_read != size) return error.UnexpectedEOF; if (bytes_read != size) return error.UnexpectedEOF;
var parser = Parser(T).init(allocator, buffer); var parser = Parser(T).init(allocator, buffer);
return try parser.parse(); return parser.parse() catch |err| {
std.log.err("Failed to parse config file '{s}': {s}", .{ path, @errorName(err) });
return err;
};
} }
pub fn loadConfDir(comptime T: type, allocator: std.mem.Allocator, dir_path: []const u8) !std.ArrayList(T) { pub fn loadConfDir(comptime T: type, allocator: std.mem.Allocator, dir_path: []const u8) !std.ArrayList(T) {
@ -43,7 +46,10 @@ pub fn loadConfDir(comptime T: type, allocator: std.mem.Allocator, dir_path: []c
defer allocator.free(content); defer allocator.free(content);
var parser = Parser(T).init(allocator, content); var parser = Parser(T).init(allocator, content);
const parsed = try parser.parse(); const parsed = parser.parse() catch |err| {
std.log.err("Failed to parse config file '{s}': {s}", .{ path, @errorName(err) });
return err;
};
try result.append(parsed); try result.append(parsed);
} }
} }

View File

@ -81,17 +81,33 @@ pub fn Parser(comptime T: type) type {
return error.InvalidSyntax; return error.InvalidSyntax;
self.pos += 1; self.pos += 1;
const start = self.pos; var escaped = false;
var result = std.ArrayList(u8).init(self.allocator);
errdefer result.deinit();
while (self.pos < self.content.len) : (self.pos += 1) { while (self.pos < self.content.len) : (self.pos += 1) {
switch (self.content[self.pos]) { const c = self.content[self.pos];
if (escaped) {
switch (c) {
'"' => try result.append('"'),
'\\' => try result.append('\\'),
'n' => try result.append('\n'),
'r' => try result.append('\r'),
't' => try result.append('\t'),
else => return error.InvalidSyntax,
}
escaped = false;
continue;
}
switch (c) {
'"' => { '"' => {
const str = try self.allocator.dupe(u8, self.content[start..self.pos]);
self.pos += 1; self.pos += 1;
return str; return result.toOwnedSlice();
}, },
'\\' => return error.InvalidSyntax, '\\' => {
else => {}, escaped = true;
},
else => try result.append(c),
} }
} }
return error.UnterminatedString; return error.UnterminatedString;
@ -162,7 +178,10 @@ pub fn Parser(comptime T: type) type {
return values.toOwnedSlice(); return values.toOwnedSlice();
} }
const str = try self.parseString(); const str = self.parseString() catch |err| {
std.log.err("Failed to parse string at position {}: {s}", .{ self.pos, @errorName(err) });
return err;
};
try values.append(str); try values.append(str);
self.skipWhitespace(); self.skipWhitespace();
@ -174,8 +193,10 @@ pub fn Parser(comptime T: type) type {
self.pos += 1; self.pos += 1;
return values.toOwnedSlice(); return values.toOwnedSlice();
} }
std.log.err("Expected ',' or ']' but found '{c}' at position {}", .{ self.content[self.pos], self.pos });
return error.InvalidSyntax; return error.InvalidSyntax;
} }
std.log.err("Unterminated array at position {}", .{self.pos});
return error.InvalidSyntax; return error.InvalidSyntax;
} }
@ -258,11 +279,16 @@ pub fn Parser(comptime T: type) type {
@field(result, field.name) = @intCast(try self.parseNumber()); @field(result, field.name) = @intCast(try self.parseNumber());
}, },
.array => |array_info| { .array => |array_info| {
const array = try self.parseArray(); switch (@typeInfo(array_info.child)) {
if (array.len > array_info.len) return error.InvalidSyntax; i64 => {
@field(result, field.name) = undefined; const array = try self.parseArray();
var dest = &@field(result, field.name); if (array.len > array_info.len) return error.InvalidSyntax;
@memcpy(dest[0..array.len], array); @field(result, field.name) = undefined;
var dest = &@field(result, field.name);
@memcpy(dest[0..array.len], array);
},
else => return error.InvalidSyntax,
}
}, },
.@"enum" => { .@"enum" => {
const ident = try self.parseIdentifier(); const ident = try self.parseIdentifier();
@ -288,18 +314,22 @@ pub fn Parser(comptime T: type) type {
} }
}, },
.pointer => |ptr_info| { .pointer => |ptr_info| {
if (ptr_info.size != .many) return error.InvalidSyntax; if (ptr_info.size != .slice) {
switch (ptr_info.child) { return error.InvalidSyntax;
}
if (ptr_info.child == []const u8) {
@field(result, field.name) = try self.parseStringArray();
} else switch (ptr_info.child) {
u8 => { u8 => {
@field(result, field.name) = try self.parseString(); @field(result, field.name) = try self.parseString();
}, },
i64 => { i64 => {
@field(result, field.name) = try self.parseArray(); @field(result, field.name) = try self.parseArray();
}, },
[]const u8 => { else => {
@field(result, field.name) = try self.parseStringArray(); return error.InvalidSyntax;
}, },
else => return error.InvalidSyntax,
} }
}, },
else => return error.InvalidSyntax, else => return error.InvalidSyntax,

View File

@ -2,7 +2,7 @@
set -e set -e
VERSION="1.0.8" VERSION="1.0.9"
source ./pika-build-config.sh source ./pika-build-config.sh