From 4fcfb9a41153af7cb329ba2987f232262fa899a0 Mon Sep 17 00:00:00 2001 From: fardragon Date: Fri, 9 Aug 2024 12:19:45 +0200 Subject: [PATCH 1/4] Fix multiValuesOption behaviour when single value is provided --- src/Arg.zig | 1 + src/Parser.zig | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) 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 }); From 4824587b9ec4ef0276ea9595226a537517f28ebb Mon Sep 17 00:00:00 2001 From: fardragon Date: Fri, 9 Aug 2024 12:22:37 +0200 Subject: [PATCH 2/4] Add Arg.multiValuesOption tests --- src/test.zig | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) 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(); From 2a737af200d5ea83ac094ab2138b44dc2d0edba8 Mon Sep 17 00:00:00 2001 From: fardragon Date: Fri, 9 Aug 2024 12:23:36 +0200 Subject: [PATCH 3/4] Bump patch version --- build.zig.zon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. }, From 8f53fcb3246a5de1c3ce7691bc689c6903206722 Mon Sep 17 00:00:00 2001 From: fardragon Date: Fri, 9 Aug 2024 12:24:15 +0200 Subject: [PATCH 4/4] Fix compiler crash during 'zig build test' --- src/lib.zig | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) 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); + } }