summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeffrey C. Ollie <jeff@ocjtech.us>2024-11-02 23:30:21 -0500
committerJeffrey C. Ollie <jeff@ocjtech.us>2024-11-08 22:32:14 -0600
commitca844ca3c064cfdd51a9c29a20dcbfe314c0d712 (patch)
tree406358ee2642f3b5b143139335e0622fe106834a /src
parent75fe0b2dfb200dda2622b0fbc790e9451ffff236 (diff)
core: list valid options if an invalid value is detected parsing an enum
Diffstat (limited to 'src')
-rw-r--r--src/cli/args.zig24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/cli/args.zig b/src/cli/args.zig
index bfd40c633..9a8d1ae42 100644
--- a/src/cli/args.zig
+++ b/src/cli/args.zig
@@ -133,7 +133,29 @@ pub fn parse(
error.OutOfMemory => return err,
error.InvalidField => "unknown field",
error.ValueRequired => "value required",
- error.InvalidValue => "invalid value",
+ error.InvalidValue => msg: {
+ var buf = std.ArrayList(u8).init(arena_alloc);
+ errdefer buf.deinit();
+ const writer = buf.writer();
+ try writer.print("invalid value \"{?s}\"", .{value});
+ const typeinfo = @typeInfo(T);
+ inline for (typeinfo.Struct.fields) |f| {
+ if (std.mem.eql(u8, key, f.name)) {
+ switch (@typeInfo(f.type)) {
+ .Enum => |e| {
+ try writer.print(", valid values are: ", .{});
+ inline for (e.fields, 0..) |field, i| {
+ if (i != 0) try writer.print(", ", .{});
+ try writer.print("{s}", .{field.name});
+ }
+ },
+ else => {},
+ }
+ break;
+ }
+ }
+ break :msg try buf.toOwnedSliceSentinel(0);
+ },
else => try std.fmt.allocPrintZ(
arena_alloc,
"unknown error {}",