diff options
| author | 2023-11-16 12:00:15 +0100 | |
|---|---|---|
| committer | 2023-11-16 12:01:26 +0100 | |
| commit | c394594d218c3c936547e590b461e69e6e0b20c4 (patch) | |
| tree | a34621bf67f3e0044c1d88ca907c681160239190 | |
| parent | Add build.zig.zon (#108) (diff) | |
| download | zig-clap-c394594d218c3c936547e590b461e69e6e0b20c4.tar.gz zig-clap-c394594d218c3c936547e590b461e69e6e0b20c4.tar.xz zig-clap-c394594d218c3c936547e590b461e69e6e0b20c4.zip | |
Fix short only params not getting fields in `Arguments`
fixes #84
| -rw-r--r-- | clap.zig | 21 |
1 files changed, 11 insertions, 10 deletions
| @@ -30,11 +30,8 @@ pub const Names = struct { | |||
| 30 | pub fn longest(names: *const Names) Longest { | 30 | pub fn longest(names: *const Names) Longest { |
| 31 | if (names.long) |long| | 31 | if (names.long) |long| |
| 32 | return .{ .kind = .long, .name = long }; | 32 | return .{ .kind = .long, .name = long }; |
| 33 | if (names.short) |*short| { | 33 | if (names.short) |*short| |
| 34 | // TODO: Zig cannot figure out @as(*const [1]u8, short) in the ano literal | 34 | return .{ .kind = .short, .name = @as(*const [1]u8, short) }; |
| 35 | const casted: *const [1]u8 = short; | ||
| 36 | return .{ .kind = .short, .name = casted }; | ||
| 37 | } | ||
| 38 | 35 | ||
| 39 | return .{ .kind = .positional, .name = "" }; | 36 | return .{ .kind = .positional, .name = "" }; |
| 40 | } | 37 | } |
| @@ -801,13 +798,14 @@ fn parseArg( | |||
| 801 | }; | 798 | }; |
| 802 | 799 | ||
| 803 | const longest = comptime param.names.longest(); | 800 | const longest = comptime param.names.longest(); |
| 801 | const name = longest.name[0..longest.name.len].*; | ||
| 804 | switch (longest.kind) { | 802 | switch (longest.kind) { |
| 805 | .short, .long => switch (param.takes_value) { | 803 | .short, .long => switch (param.takes_value) { |
| 806 | .none => @field(arguments, longest.name) +|= 1, | 804 | .none => @field(arguments, &name) +|= 1, |
| 807 | .one => @field(arguments, longest.name) = try parser(arg.value.?), | 805 | .one => @field(arguments, &name) = try parser(arg.value.?), |
| 808 | .many => { | 806 | .many => { |
| 809 | const value = try parser(arg.value.?); | 807 | const value = try parser(arg.value.?); |
| 810 | try @field(arguments, longest.name).append(allocator, value); | 808 | try @field(arguments, &name).append(allocator, value); |
| 811 | }, | 809 | }, |
| 812 | }, | 810 | }, |
| 813 | .positional => try positionals.append(try parser(arg.value.?)), | 811 | .positional => try positionals.append(try parser(arg.value.?)), |
| @@ -920,8 +918,9 @@ fn Arguments( | |||
| 920 | }, | 918 | }, |
| 921 | }; | 919 | }; |
| 922 | 920 | ||
| 921 | const name = longest.name[0..longest.name.len].*; | ||
| 923 | fields[i] = .{ | 922 | fields[i] = .{ |
| 924 | .name = longest.name, | 923 | .name = &name, |
| 925 | .type = @TypeOf(default_value), | 924 | .type = @TypeOf(default_value), |
| 926 | .default_value = @ptrCast(&default_value), | 925 | .default_value = @ptrCast(&default_value), |
| 927 | .is_comptime = false, | 926 | .is_comptime = false, |
| @@ -960,12 +959,13 @@ test "everything" { | |||
| 960 | \\-b, --bb | 959 | \\-b, --bb |
| 961 | \\-c, --cc <str> | 960 | \\-c, --cc <str> |
| 962 | \\-d, --dd <usize>... | 961 | \\-d, --dd <usize>... |
| 962 | \\-h | ||
| 963 | \\<str> | 963 | \\<str> |
| 964 | \\ | 964 | \\ |
| 965 | ); | 965 | ); |
| 966 | 966 | ||
| 967 | var iter = args.SliceIterator{ | 967 | var iter = args.SliceIterator{ |
| 968 | .args = &.{ "-a", "--aa", "-c", "0", "something", "-d", "1", "--dd", "2" }, | 968 | .args = &.{ "-a", "--aa", "-c", "0", "something", "-d", "1", "--dd", "2", "-h" }, |
| 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, |
| @@ -974,6 +974,7 @@ test "everything" { | |||
| 974 | 974 | ||
| 975 | try testing.expect(res.args.aa == 2); | 975 | try testing.expect(res.args.aa == 2); |
| 976 | try testing.expect(res.args.bb == 0); | 976 | try testing.expect(res.args.bb == 0); |
| 977 | try testing.expect(res.args.h == 1); | ||
| 977 | try testing.expectEqualStrings("0", res.args.cc.?); | 978 | try testing.expectEqualStrings("0", res.args.cc.?); |
| 978 | try testing.expectEqual(@as(usize, 1), res.positionals.len); | 979 | try testing.expectEqual(@as(usize, 1), res.positionals.len); |
| 979 | try testing.expectEqualStrings("something", res.positionals[0]); | 980 | try testing.expectEqualStrings("something", res.positionals[0]); |