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

This commit is contained in:
2026-04-21 18:05:02 -04:00
parent bd2a5455af
commit ae4454596a
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) {
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,

View File

@@ -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;

View File

@@ -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.
.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" },
},
});
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);
}