| ... | ... | @@ -40,15 +40,15 @@ fn clean(out: anytype, n: usize) !void { |
| 40 | 40 | } |
| 41 | 41 | } |
| 42 | 42 | |
| 43 | | pub fn forEnum(out: anytype, in: anytype, comptime prompt: []const u8, alloc: std.mem.Allocator, comptime options: type, default: ?options) !options { |
| 44 | | comptime std.debug.assert(@typeInfo(options) == .Enum); |
| 43 | pub fn forEnum(out: anytype, in: anytype, comptime prompt: []const u8, alloc: std.mem.Allocator, comptime E: type, default: ?E) !E { |
| 44 | comptime std.debug.assert(@typeInfo(E) == .Enum); |
| 45 | 45 | const def: ?[]const u8 = if (default) |d| @tagName(d) else null; |
| 46 | 46 | |
| 47 | 47 | try out.print(comptime ansi.color.Fg(.Green, "? "), .{}); |
| 48 | 48 | try out.print(comptime ansi.color.Bold(prompt ++ " "), .{}); |
| 49 | 49 | |
| 50 | 50 | try out.print(ansi.style.Faint ++ "(", .{}); |
| 51 | | inline for (std.meta.fields(options), 0..) |f, i| { |
| 51 | inline for (std.meta.fields(E), 0..) |f, i| { |
| 52 | 52 | if (i != 0) try out.print("/", .{}); |
| 53 | 53 | if (std.mem.eql(u8, f.name, def orelse "")) { |
| 54 | 54 | try out.print(ansi.style.ResetIntensity, .{}); |
| ... | ... | @@ -58,14 +58,14 @@ pub fn forEnum(out: anytype, in: anytype, comptime prompt: []const u8, alloc: st |
| 58 | 58 | } |
| 59 | 59 | try out.print(")" ++ ansi.style.ResetIntensity ++ " ", .{}); |
| 60 | 60 | |
| 61 | | var value: options = undefined; |
| 61 | var value: E = undefined; |
| 62 | 62 | var i: usize = 0; |
| 63 | 63 | while (true) { |
| 64 | 64 | const p = try doprompt(out, in, alloc, def); |
| 65 | 65 | defer if (!std.mem.eql(u8, p.value, def orelse "")) alloc.free(p.value); |
| 66 | 66 | |
| 67 | 67 | i += p.n; |
| 68 | | if (std.meta.stringToEnum(options, p.value)) |cap| { |
| 68 | if (std.meta.stringToEnum(E, p.value)) |cap| { |
| 69 | 69 | value = cap; |
| 70 | 70 | break; |
| 71 | 71 | } |