summaryrefslogtreecommitdiff
path: root/clap.zig
diff options
context:
space:
mode:
authorGravatar Devin J. Pohly2023-04-02 06:10:40 -0500
committerGravatar GitHub2023-04-02 13:10:40 +0200
commitab69ef2db44b6c4b7f00283d52d38fbe71d16c42 (patch)
tree10416c0cdda32ba98d54954940c440beac6ccf08 /clap.zig
parentUpdate build script to actually run the tests (diff)
downloadzig-clap-ab69ef2db44b6c4b7f00283d52d38fbe71d16c42.tar.gz
zig-clap-ab69ef2db44b6c4b7f00283d52d38fbe71d16c42.tar.xz
zig-clap-ab69ef2db44b6c4b7f00283d52d38fbe71d16c42.zip
Count occurrences of flags (was "Add .count type for flags") (#96)
Breaking change: parseEx now counts the number of occurrences of flag parameters (those with takes_value == .none) and returns the count as a u8. Users of the library will need to change if (arg_result.my_flag) to if (arg_result.my_flag != 0)
Diffstat (limited to 'clap.zig')
-rw-r--r--clap.zig26
1 files changed, 21 insertions, 5 deletions
diff --git a/clap.zig b/clap.zig
index 50b8c1c..8a9b961 100644
--- a/clap.zig
+++ b/clap.zig
@@ -803,7 +803,7 @@ fn parseArg(
803 const longest = comptime param.names.longest(); 803 const longest = comptime param.names.longest();
804 switch (longest.kind) { 804 switch (longest.kind) {
805 .short, .long => switch (param.takes_value) { 805 .short, .long => switch (param.takes_value) {
806 .none => @field(arguments, longest.name) = true, 806 .none => @field(arguments, longest.name) +|= 1,
807 .one => @field(arguments, longest.name) = try parser(arg.value.?), 807 .one => @field(arguments, longest.name) = try parser(arg.value.?),
808 .many => { 808 .many => {
809 const value = try parser(arg.value.?); 809 const value = try parser(arg.value.?);
@@ -912,7 +912,7 @@ fn Arguments(
912 912
913 const T = ParamType(Id, param, value_parsers); 913 const T = ParamType(Id, param, value_parsers);
914 const default_value = switch (param.takes_value) { 914 const default_value = switch (param.takes_value) {
915 .none => false, 915 .none => @as(u8, 0),
916 .one => @as(?T, null), 916 .one => @as(?T, null),
917 .many => switch (multi_arg_kind) { 917 .many => switch (multi_arg_kind) {
918 .slice => @as([]const T, &[_]T{}), 918 .slice => @as([]const T, &[_]T{}),
@@ -965,21 +965,37 @@ test "everything" {
965 ); 965 );
966 966
967 var iter = args.SliceIterator{ 967 var iter = args.SliceIterator{
968 .args = &.{ "-a", "-c", "0", "something", "-d", "1", "--dd", "2" }, 968 .args = &.{ "-a", "--aa", "-c", "0", "something", "-d", "1", "--dd", "2" },
969 }; 969 };
970 var res = try parseEx(Help, &params, parsers.default, &iter, .{ 970 var res = try parseEx(Help, &params, parsers.default, &iter, .{
971 .allocator = testing.allocator, 971 .allocator = testing.allocator,
972 }); 972 });
973 defer res.deinit(); 973 defer res.deinit();
974 974
975 try testing.expect(res.args.aa); 975 try testing.expect(res.args.aa == 2);
976 try testing.expect(!res.args.bb); 976 try testing.expect(res.args.bb == 0);
977 try testing.expectEqualStrings("0", res.args.cc.?); 977 try testing.expectEqualStrings("0", res.args.cc.?);
978 try testing.expectEqual(@as(usize, 1), res.positionals.len); 978 try testing.expectEqual(@as(usize, 1), res.positionals.len);
979 try testing.expectEqualStrings("something", res.positionals[0]); 979 try testing.expectEqualStrings("something", res.positionals[0]);
980 try testing.expectEqualSlices(usize, &.{ 1, 2 }, res.args.dd); 980 try testing.expectEqualSlices(usize, &.{ 1, 2 }, res.args.dd);
981} 981}
982 982
983test "overflow-safe" {
984 const params = comptime parseParamsComptime(
985 \\-a, --aa
986 );
987
988 var iter = args.SliceIterator{
989 .args = &(.{"-" ++ ("a" ** 300)}),
990 };
991
992 // This just needs to not crash
993 var res = try parseEx(Help, &params, parsers.default, &iter, .{
994 .allocator = testing.allocator,
995 });
996 defer res.deinit();
997}
998
983test "empty" { 999test "empty" {
984 var iter = args.SliceIterator{ .args = &.{} }; 1000 var iter = args.SliceIterator{ .args = &.{} };
985 var res = try parseEx(u8, &[_]Param(u8){}, parsers.default, &iter, .{ 1001 var res = try parseEx(u8, &[_]Param(u8){}, parsers.default, &iter, .{