diff options
| author | Jeffrey C. Ollie <jeff@ocjtech.us> | 2024-11-02 23:30:21 -0500 |
|---|---|---|
| committer | Jeffrey C. Ollie <jeff@ocjtech.us> | 2024-11-08 22:32:14 -0600 |
| commit | ca844ca3c064cfdd51a9c29a20dcbfe314c0d712 (patch) | |
| tree | 406358ee2642f3b5b143139335e0622fe106834a /src/cli/args.zig | |
| parent | 75fe0b2dfb200dda2622b0fbc790e9451ffff236 (diff) | |
core: list valid options if an invalid value is detected parsing an enum
Diffstat (limited to 'src/cli/args.zig')
| -rw-r--r-- | src/cli/args.zig | 24 |
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 {}", |
