Add better error logging and fix config parsing in newer zig versions
This commit is contained in:
parent
787bd99c06
commit
d887536199
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user