From ae4454596a1d88fe3221dfa8ed243ede2da46105 Mon Sep 17 00:00:00 2001 From: Spencer Brower Date: Tue, 21 Apr 2026 18:05:02 -0400 Subject: [PATCH] feat(comma): Added enum value for unknown commands. --- src/comma.zig | 14 +++++++++----- src/main.zig | 12 ++++++------ src/root.zig | 17 +++++++++++++---- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/comma.zig b/src/comma.zig index 9ea66c6..6d37a88 100644 --- a/src/comma.zig +++ b/src/comma.zig @@ -27,10 +27,11 @@ pub const Command = struct { }; } - pub fn parse(comptime self: @This(), args: []const []const u8) ParseError!self.Type { + pub fn parse(comptime self: @This(), args: []const []const u8) self.Type { if (args.len == 0) { - return ParseError.InvalidType; + return @enumFromInt(0); } + const target = args[0]; inline for (self.subcommands, 1..) |cmd, idx| { @@ -39,7 +40,7 @@ pub const Command = struct { } } - return @enumFromInt(0); + return @enumFromInt(self.subcommands.len + 1); } }; @@ -54,8 +55,8 @@ const CommandOptions = struct { subcommands: []const CommandOptions = &[0]CommandOptions{}, fn as_enum(self: @This()) type { - var field_names: [self.subcommands.len + 1][]const u8 = undefined; - var field_values: [self.subcommands.len + 1]u32 = undefined; + var field_names: [self.subcommands.len + 2][]const u8 = undefined; + var field_values: [self.subcommands.len + 2]u32 = undefined; field_names[0] = self.name; field_values[0] = 0; @@ -65,6 +66,9 @@ const CommandOptions = struct { field_values[idx] = idx; } + field_names[self.subcommands.len + 1] = "unknown"; + field_values[self.subcommands.len + 1] = self.subcommands.len + 1; + return @Enum( u32, .exhaustive, diff --git a/src/main.zig b/src/main.zig index 5840911..581a36f 100644 --- a/src/main.zig +++ b/src/main.zig @@ -14,20 +14,20 @@ pub fn main(init: std.process.Init) !void { const args = try init.minimal.args.toSlice(arena); - try run(init.io, init.environ_map, args); //catch return fallback_to_go(init.io, arena, args); + try run(init.environ_map, init.io, arena, args); } /// Attempt to run the requested command. fn run( - io: Io, environ_map: *std.process.Environ.Map, + io: Io, + arena: std.mem.Allocator, args: []const [:0]const u8, ) !void { - const cmd = try envr.root.parse(args[1..]); + const cmd = envr.root.parse(args[1..]); switch (cmd) { - .envr => { - // TODO: Print help - return comma.ParseError.InvalidType; + .envr, .unknown => { + return fallback_to_go(io, arena, args); }, .version => { var stdout_buffer: [1024]u8 = undefined; diff --git a/src/root.zig b/src/root.zig index cd74ab6..22c3e27 100644 --- a/src/root.zig +++ b/src/root.zig @@ -11,16 +11,18 @@ pub const root: Command = .new(.{ .{ .name = "deps", .short = "Check for missing binaries", - .long = \\envr relies on external binaries for certain functionality. - \\ - \\ The deps command reports which binaries are available and which are not.", + .long = + \\envr relies on external binaries for certain functionality. + \\ + \\ The deps command reports which binaries are available and which are not." + , }, .{ .name = "version" }, }, }); test "enum type" { - const got: root.Type = @enumFromInt(1); + const got: root.Type = @enumFromInt(2); try std.testing.expectEqual(.version, got); } @@ -31,3 +33,10 @@ test "parse version" { try std.testing.expectEqual(.version, cmd); } + +test "parse unknown" { + const args = &[_][]const u8{"bad", "value"}; + const cmd = root.parse(args); + + try std.testing.expectEqual(.unknown, cmd); +}