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