From 781670589874276c2f01a49b21e91532a1baebc3 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 16 Dec 2024 18:03:32 -0600 Subject: [PATCH] build: allow CLI actions to have enum option values A typo in the fish completions (that was likely copied to the zsh and bash completions) prevented CLI actions from using enums as option values because the completions tried to access non-existent fields from type introspection. This doesn't cause any problems _now_ because no CLI action uses an enum as an option value. However as soon as you try and add one the completions fail to compile. This patch fixes the incorrect field reference. It also adds the ability to have _optional_ enums as option values. --- src/build/bash_completions.zig | 19 ++++++++++++++++++- src/build/fish_completions.zig | 15 ++++++++++++++- src/build/zsh_completions.zig | 19 ++++++++++++++++++- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/build/bash_completions.zig b/src/build/bash_completions.zig index 02da91ac4..0e27a9be6 100644 --- a/src/build/bash_completions.zig +++ b/src/build/bash_completions.zig @@ -181,12 +181,29 @@ fn writeBashCompletions(writer: anytype) !void { .Bool => try writer.writeAll("return ;;"), .Enum => |info| { try writer.writeAll(compgenPrefix); - for (info.opts, 0..) |f, i| { + for (info.fields, 0..) |f, i| { if (i > 0) try writer.writeAll(" "); try writer.writeAll(f.name); } try writer.writeAll(compgenSuffix); }, + .Optional => |optional| { + switch (@typeInfo(optional.child)) { + .Enum => |info| { + try writer.writeAll(compgenPrefix); + for (info.fields, 0..) |f, i| { + if (i > 0) try writer.writeAll(" "); + try writer.writeAll(f.name); + } + try writer.writeAll(compgenSuffix); + }, + else => { + if (std.mem.eql(u8, "config-file", opt.name)) { + try writer.writeAll("return ;;"); + } else try writer.writeAll("return;;"); + }, + } + }, else => { if (std.mem.eql(u8, "config-file", opt.name)) { try writer.writeAll("return ;;"); diff --git a/src/build/fish_completions.zig b/src/build/fish_completions.zig index 049ff06be..a06199256 100644 --- a/src/build/fish_completions.zig +++ b/src/build/fish_completions.zig @@ -117,12 +117,25 @@ fn writeFishCompletions(writer: anytype) !void { .Bool => try writer.writeAll(" -a \"true false\""), .Enum => |info| { try writer.writeAll(" -a \""); - for (info.opts, 0..) |f, i| { + for (info.fields, 0..) |f, i| { if (i > 0) try writer.writeAll(" "); try writer.writeAll(f.name); } try writer.writeAll("\""); }, + .Optional => |optional| { + switch (@typeInfo(optional.child)) { + .Enum => |info| { + try writer.writeAll(" -a \""); + for (info.fields, 0..) |f, i| { + if (i > 0) try writer.writeAll(" "); + try writer.writeAll(f.name); + } + try writer.writeAll("\""); + }, + else => {}, + } + }, else => {}, } try writer.writeAll("\n"); diff --git a/src/build/zsh_completions.zig b/src/build/zsh_completions.zig index d03ff1a06..a451c7175 100644 --- a/src/build/zsh_completions.zig +++ b/src/build/zsh_completions.zig @@ -175,12 +175,29 @@ fn writeZshCompletions(writer: anytype) !void { .Bool => try writer.writeAll("(true false)"), .Enum => |info| { try writer.writeAll("("); - for (info.opts, 0..) |f, i| { + for (info.fields, 0..) |f, i| { if (i > 0) try writer.writeAll(" "); try writer.writeAll(f.name); } try writer.writeAll(")"); }, + .Optional => |optional| { + switch (@typeInfo(optional.child)) { + .Enum => |info| { + try writer.writeAll("("); + for (info.fields, 0..) |f, i| { + if (i > 0) try writer.writeAll(" "); + try writer.writeAll(f.name); + } + try writer.writeAll(")"); + }, + else => { + if (std.mem.eql(u8, "config-file", opt.name)) { + try writer.writeAll("_files"); + } else try writer.writeAll("( )"); + }, + } + }, else => { if (std.mem.eql(u8, "config-file", opt.name)) { try writer.writeAll("_files");