feat(comma): Added enum value for unknown commands.

This commit is contained in:
2026-04-21 18:05:02 -04:00
parent 89ac19b246
commit 33ca6525e2
3 changed files with 28 additions and 15 deletions

View File

@@ -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) { if (args.len == 0) {
return ParseError.InvalidType; return @enumFromInt(0);
} }
const target = args[0]; const target = args[0];
inline for (self.subcommands, 1..) |cmd, idx| { 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{}, subcommands: []const CommandOptions = &[0]CommandOptions{},
fn as_enum(self: @This()) type { fn as_enum(self: @This()) type {
var field_names: [self.subcommands.len + 1][]const u8 = undefined; var field_names: [self.subcommands.len + 2][]const u8 = undefined;
var field_values: [self.subcommands.len + 1]u32 = undefined; var field_values: [self.subcommands.len + 2]u32 = undefined;
field_names[0] = self.name; field_names[0] = self.name;
field_values[0] = 0; field_values[0] = 0;
@@ -65,6 +66,9 @@ const CommandOptions = struct {
field_values[idx] = idx; field_values[idx] = idx;
} }
field_names[self.subcommands.len + 1] = "unknown";
field_values[self.subcommands.len + 1] = self.subcommands.len + 1;
return @Enum( return @Enum(
u32, u32,
.exhaustive, .exhaustive,

View File

@@ -14,20 +14,20 @@ pub fn main(init: std.process.Init) !void {
const args = try init.minimal.args.toSlice(arena); 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. /// Attempt to run the requested command.
fn run( fn run(
io: Io,
environ_map: *std.process.Environ.Map, environ_map: *std.process.Environ.Map,
io: Io,
arena: std.mem.Allocator,
args: []const [:0]const u8, args: []const [:0]const u8,
) !void { ) !void {
const cmd = try envr.root.parse(args[1..]); const cmd = envr.root.parse(args[1..]);
switch (cmd) { switch (cmd) {
.envr => { .envr, .unknown => {
// TODO: Print help return fallback_to_go(io, arena, args);
return comma.ParseError.InvalidType;
}, },
.version => { .version => {
var stdout_buffer: [1024]u8 = undefined; var stdout_buffer: [1024]u8 = undefined;

View File

@@ -11,16 +11,18 @@ pub const root: Command = .new(.{
.{ .{
.name = "deps", .name = "deps",
.short = "Check for missing binaries", .short = "Check for missing binaries",
.long = \\envr relies on external binaries for certain functionality. .long =
\\ \\envr relies on external binaries for certain functionality.
\\ The deps command reports which binaries are available and which are not.", \\
\\ The deps command reports which binaries are available and which are not."
,
}, },
.{ .name = "version" }, .{ .name = "version" },
}, },
}); });
test "enum type" { test "enum type" {
const got: root.Type = @enumFromInt(1); const got: root.Type = @enumFromInt(2);
try std.testing.expectEqual(.version, got); try std.testing.expectEqual(.version, got);
} }
@@ -31,3 +33,10 @@ test "parse version" {
try std.testing.expectEqual(.version, cmd); 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);
}