diff options
| author | 2023-04-02 06:10:40 -0500 | |
|---|---|---|
| committer | 2023-04-02 13:10:40 +0200 | |
| commit | ab69ef2db44b6c4b7f00283d52d38fbe71d16c42 (patch) | |
| tree | 10416c0cdda32ba98d54954940c440beac6ccf08 /clap.zig | |
| parent | Update build script to actually run the tests (diff) | |
| download | zig-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 '')
| -rw-r--r-- | clap.zig | 26 |
1 files changed, 21 insertions, 5 deletions
| @@ -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, ¶ms, parsers.default, &iter, .{ | 970 | var res = try parseEx(Help, ¶ms, 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 | ||
| 983 | test "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, ¶ms, parsers.default, &iter, .{ | ||
| 994 | .allocator = testing.allocator, | ||
| 995 | }); | ||
| 996 | defer res.deinit(); | ||
| 997 | } | ||
| 998 | |||
| 983 | test "empty" { | 999 | test "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, .{ |