From a359641d073ae329028de50eaaa406458fd1d113 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 11 Sep 2023 09:14:27 -0700 Subject: [PATCH] config: store unknown errors in list too --- src/cli_args.zig | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/cli_args.zig b/src/cli_args.zig index 7559ee162..fc056f43c 100644 --- a/src/cli_args.zig +++ b/src/cli_args.zig @@ -78,7 +78,15 @@ pub fn parse(comptime T: type, alloc: Allocator, dst: *T, iter: anytype) !void { parseIntoField(T, arena_alloc, dst, key, value) catch |err| { if (comptime !canTrackErrors(T)) return err; - switch (err) { + + // The error set is dependent on comptime T, so we always add + // an extra error so we can have the "else" below. + const ErrSet = @TypeOf(err) || error{Unknown}; + switch (@as(ErrSet, @errSetCast(err))) { + // OOM is not recoverable since we need to allocate to + // track more error messages. + error.OutOfMemory => return err, + error.InvalidField => try dst._errors.add(arena_alloc, .{ .message = try std.fmt.allocPrintZ( arena_alloc, @@ -103,7 +111,13 @@ pub fn parse(comptime T: type, alloc: Allocator, dst: *T, iter: anytype) !void { ), }), - else => return err, + else => try dst._errors.add(arena_alloc, .{ + .message = try std.fmt.allocPrintZ( + arena_alloc, + "{s}: unknown error {}", + .{ key, err }, + ), + }), } }; }