mirror of
https://github.com/sbrow/envr.git
synced 2026-06-27 18:48:33 -04:00
feat(comma): Added enum value for unknown commands.
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
12
src/main.zig
12
src/main.zig
@@ -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;
|
||||||
|
|||||||
17
src/root.zig
17
src/root.zig
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user