diff --git a/build.zig.zon b/build.zig.zon index 4fa3f8b..784223e 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,6 +1,6 @@ .{ .name = "yazap", - .version = "0.5.1", + .version = "0.5.2", .dependencies = .{ // See `zig fetch --save ` for a command-line interface for adding dependencies. }, diff --git a/src/Arg.zig b/src/Arg.zig index e2a5f70..144b65e 100644 --- a/src/Arg.zig +++ b/src/Arg.zig @@ -174,6 +174,7 @@ pub fn multiValuesOption( arg.setMaxValues(max_values); arg.setDefaultValuesDelimiter(); arg.setProperty(.takes_value); + arg.setProperty(.takes_multiple_values); return arg; } diff --git a/src/Parser.zig b/src/Parser.zig index 520a12e..79519c8 100644 --- a/src/Parser.zig +++ b/src/Parser.zig @@ -274,7 +274,7 @@ fn parseOptionValue(self: *Parser, arg: *const Arg, attached_value: ?[]const u8) self.err.setContext(.{ .valid_arg = arg.name }); return Error.ArgValueNotProvided; } - if (values.items.len == 1) { + if (values.items.len == 1 and !arg.hasProperty(.takes_multiple_values)) { const value = values.pop(); try self.verifyValue(arg, value); try self.putMatchedArg(arg, .{ .single = value }); diff --git a/src/lib.zig b/src/lib.zig index 3d6f175..dfca346 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -4,8 +4,15 @@ pub const Arg = @import("Arg.zig"); pub const arg_matches = @import("arg_matches.zig"); pub const ArgMatches = arg_matches.ArgMatches; pub const Command = @import("Command.zig"); -pub const YazapError = @import("error.zig").YazapError; +pub const yazap_error = @import("error.zig"); +pub const YazapError = yazap_error.YazapError; test "emit docs" { - std.testing.refAllDeclsRecursive(@This()); + comptime { + std.testing.refAllDecls(App); + std.testing.refAllDecls(Arg); + std.testing.refAllDecls(arg_matches); + std.testing.refAllDecls(Command); + std.testing.refAllDecls(yazap_error); + } } diff --git a/src/test.zig b/src/test.zig index 3277137..ba36e0a 100644 --- a/src/test.zig +++ b/src/test.zig @@ -153,6 +153,58 @@ test "Option that takes single value" { app.deinit(); } +test "multiValuesOption provided with single value short" { + var app = App.init(allocator, "clang", null); + defer app.deinit(); + + const srcs = Arg.multiValuesOption("sources", 's', null, 128); + + // ex: clang sources... + try app.rootCommand().addArg(srcs); + + const matches_short = try app.parseFrom(&.{ "-s", "f1" }); + try testing.expectEqual(@as(usize, 1), matches_short.getMultiValues("sources").?.len); +} + +test "multiValuesOption provided with single value long" { + var app = App.init(allocator, "clang", null); + defer app.deinit(); + + const srcs = Arg.multiValuesOption("sources", 's', null, 128); + + // ex: clang sources... + try app.rootCommand().addArg(srcs); + + const matches_short = try app.parseFrom(&.{ "--sources", "f1" }); + try testing.expectEqual(@as(usize, 1), matches_short.getMultiValues("sources").?.len); +} + +test "multiValuesOption provided with multiple values short" { + var app = App.init(allocator, "clang", null); + defer app.deinit(); + + const srcs = Arg.multiValuesOption("sources", 's', null, 128); + + // ex: clang sources... + try app.rootCommand().addArg(srcs); + const matches = try app.parseFrom(&.{ "-s", "f1", "f2", "f3", "f4", "f5" }); + + try testing.expectEqual(@as(usize, 5), matches.getMultiValues("sources").?.len); +} + +test "multiValuesOption provided with multiple values long" { + var app = App.init(allocator, "clang", null); + defer app.deinit(); + + const srcs = Arg.multiValuesOption("sources", 's', null, 128); + + // ex: clang sources... + try app.rootCommand().addArg(srcs); + const matches = try app.parseFrom(&.{ "--sources", "f1", "f2", "f3", "f4", "f5" }); + + try testing.expectEqual(@as(usize, 5), matches.getMultiValues("sources").?.len); +} + test "Option that takes many/multiple values" { var app = App.init(allocator, "clang", null); errdefer app.deinit();