diff options
| author | 2024-11-14 16:22:40 +0100 | |
|---|---|---|
| committer | 2024-11-15 09:35:33 +0100 | |
| commit | 2e58c8e49a0da7075fc66e4ae499b7acc5ea5a3f (patch) | |
| tree | bcc7c40e0ba39026f5aa1f90a0bbedd375fc2330 /clap | |
| parent | fix: add uint parsing function (diff) | |
| download | zig-clap-2e58c8e49a0da7075fc66e4ae499b7acc5ea5a3f.tar.gz zig-clap-2e58c8e49a0da7075fc66e4ae499b7acc5ea5a3f.tar.xz zig-clap-2e58c8e49a0da7075fc66e4ae499b7acc5ea5a3f.zip | |
refactor: switch on signedness
Diffstat (limited to 'clap')
| -rw-r--r-- | clap/parsers.zig | 60 |
1 files changed, 27 insertions, 33 deletions
diff --git a/clap/parsers.zig b/clap/parsers.zig index 334c639..5750308 100644 --- a/clap/parsers.zig +++ b/clap/parsers.zig | |||
| @@ -1,11 +1,11 @@ | |||
| 1 | pub const default = .{ | 1 | pub const default = .{ |
| 2 | .string = string, | 2 | .string = string, |
| 3 | .str = string, | 3 | .str = string, |
| 4 | .u8 = uint(u8, 0), | 4 | .u8 = int(u8, 0), |
| 5 | .u16 = uint(u16, 0), | 5 | .u16 = int(u16, 0), |
| 6 | .u32 = uint(u32, 0), | 6 | .u32 = int(u32, 0), |
| 7 | .u64 = uint(u64, 0), | 7 | .u64 = int(u64, 0), |
| 8 | .usize = uint(usize, 0), | 8 | .usize = int(usize, 0), |
| 9 | .i8 = int(i8, 0), | 9 | .i8 = int(i8, 0), |
| 10 | .i16 = int(i16, 0), | 10 | .i16 = int(i16, 0), |
| 11 | .i32 = int(i32, 0), | 11 | .i32 = int(i32, 0), |
| @@ -24,41 +24,19 @@ test "string" { | |||
| 24 | try std.testing.expectEqualStrings("aa", try string("aa")); | 24 | try std.testing.expectEqualStrings("aa", try string("aa")); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | /// A parser that uses `std.fmt.parseInt` to parse the string into an integer value. | 27 | /// A parser that uses `std.fmt.parseInt` or `std.fmt.parseUnsigned` to parse the string into an integer value. |
| 28 | /// See `std.fmt.parseInt` documentation for more information. | 28 | /// See `std.fmt.parseInt` and `std.fmt.parseUnsigned` documentation for more information. |
| 29 | pub fn int(comptime T: type, comptime base: u8) fn ([]const u8) std.fmt.ParseIntError!T { | 29 | pub fn int(comptime T: type, comptime base: u8) fn ([]const u8) std.fmt.ParseIntError!T { |
| 30 | return struct { | 30 | return struct { |
| 31 | fn parse(in: []const u8) std.fmt.ParseIntError!T { | 31 | fn parse(in: []const u8) std.fmt.ParseIntError!T { |
| 32 | return std.fmt.parseInt(T, in, base); | 32 | return switch (@typeInfo(T).int.signedness) { |
| 33 | .signed => std.fmt.parseInt(T, in, base), | ||
| 34 | .unsigned => std.fmt.parseUnsigned(T, in, base), | ||
| 35 | }; | ||
| 33 | } | 36 | } |
| 34 | }.parse; | 37 | }.parse; |
| 35 | } | 38 | } |
| 36 | 39 | ||
| 37 | pub fn uint(comptime T: type, comptime base: u8) fn ([]const u8) std.fmt.ParseIntError!T { | ||
| 38 | return struct { | ||
| 39 | fn parse(in: []const u8) std.fmt.ParseIntError!T { | ||
| 40 | return std.fmt.parseUnsigned(T, in, base); | ||
| 41 | } | ||
| 42 | }.parse; | ||
| 43 | } | ||
| 44 | |||
| 45 | test "uint" { | ||
| 46 | try std.testing.expectEqual(@as(u8, 0), try uint(u8, 10)("0")); | ||
| 47 | try std.testing.expectEqual(@as(u8, 1), try uint(u8, 10)("1")); | ||
| 48 | try std.testing.expectEqual(@as(u8, 10), try uint(u8, 10)("10")); | ||
| 49 | try std.testing.expectEqual(@as(u8, 0b10), try uint(u8, 2)("10")); | ||
| 50 | try std.testing.expectEqual(@as(u8, 0x10), try uint(u8, 0)("0x10")); | ||
| 51 | try std.testing.expectEqual(@as(u8, 0b10), try uint(u8, 0)("0b10")); | ||
| 52 | try std.testing.expectEqual(@as(u16, 0), try uint(u16, 10)("0")); | ||
| 53 | try std.testing.expectEqual(@as(u16, 1), try uint(u16, 10)("1")); | ||
| 54 | try std.testing.expectEqual(@as(u16, 10), try uint(u16, 10)("10")); | ||
| 55 | try std.testing.expectEqual(@as(u16, 0b10), try uint(u16, 2)("10")); | ||
| 56 | try std.testing.expectEqual(@as(u16, 0x10), try uint(u16, 0)("0x10")); | ||
| 57 | try std.testing.expectEqual(@as(u16, 0b10), try uint(u16, 0)("0b10")); | ||
| 58 | |||
| 59 | try std.testing.expectEqual(std.fmt.ParseIntError.InvalidCharacter, uint(u8, 10)("-10")); | ||
| 60 | } | ||
| 61 | |||
| 62 | test "int" { | 40 | test "int" { |
| 63 | try std.testing.expectEqual(@as(i8, 0), try int(i8, 10)("0")); | 41 | try std.testing.expectEqual(@as(i8, 0), try int(i8, 10)("0")); |
| 64 | try std.testing.expectEqual(@as(i8, 1), try int(i8, 10)("1")); | 42 | try std.testing.expectEqual(@as(i8, 1), try int(i8, 10)("1")); |
| @@ -72,6 +50,7 @@ test "int" { | |||
| 72 | try std.testing.expectEqual(@as(i16, 0b10), try int(i16, 2)("10")); | 50 | try std.testing.expectEqual(@as(i16, 0b10), try int(i16, 2)("10")); |
| 73 | try std.testing.expectEqual(@as(i16, 0x10), try int(i16, 0)("0x10")); | 51 | try std.testing.expectEqual(@as(i16, 0x10), try int(i16, 0)("0x10")); |
| 74 | try std.testing.expectEqual(@as(i16, 0b10), try int(i16, 0)("0b10")); | 52 | try std.testing.expectEqual(@as(i16, 0b10), try int(i16, 0)("0b10")); |
| 53 | |||
| 75 | try std.testing.expectEqual(@as(i8, 0), try int(i8, 10)("-0")); | 54 | try std.testing.expectEqual(@as(i8, 0), try int(i8, 10)("-0")); |
| 76 | try std.testing.expectEqual(@as(i8, -1), try int(i8, 10)("-1")); | 55 | try std.testing.expectEqual(@as(i8, -1), try int(i8, 10)("-1")); |
| 77 | try std.testing.expectEqual(@as(i8, -10), try int(i8, 10)("-10")); | 56 | try std.testing.expectEqual(@as(i8, -10), try int(i8, 10)("-10")); |
| @@ -84,6 +63,21 @@ test "int" { | |||
| 84 | try std.testing.expectEqual(@as(i16, -0b10), try int(i16, 2)("-10")); | 63 | try std.testing.expectEqual(@as(i16, -0b10), try int(i16, 2)("-10")); |
| 85 | try std.testing.expectEqual(@as(i16, -0x10), try int(i16, 0)("-0x10")); | 64 | try std.testing.expectEqual(@as(i16, -0x10), try int(i16, 0)("-0x10")); |
| 86 | try std.testing.expectEqual(@as(i16, -0b10), try int(i16, 0)("-0b10")); | 65 | try std.testing.expectEqual(@as(i16, -0b10), try int(i16, 0)("-0b10")); |
| 66 | |||
| 67 | try std.testing.expectEqual(@as(u8, 0), try int(u8, 10)("0")); | ||
| 68 | try std.testing.expectEqual(@as(u8, 1), try int(u8, 10)("1")); | ||
| 69 | try std.testing.expectEqual(@as(u8, 10), try int(u8, 10)("10")); | ||
| 70 | try std.testing.expectEqual(@as(u8, 0b10), try int(u8, 2)("10")); | ||
| 71 | try std.testing.expectEqual(@as(u8, 0x10), try int(u8, 0)("0x10")); | ||
| 72 | try std.testing.expectEqual(@as(u8, 0b10), try int(u8, 0)("0b10")); | ||
| 73 | try std.testing.expectEqual(@as(u16, 0), try int(u16, 10)("0")); | ||
| 74 | try std.testing.expectEqual(@as(u16, 1), try int(u16, 10)("1")); | ||
| 75 | try std.testing.expectEqual(@as(u16, 10), try int(u16, 10)("10")); | ||
| 76 | try std.testing.expectEqual(@as(u16, 0b10), try int(u16, 2)("10")); | ||
| 77 | try std.testing.expectEqual(@as(u16, 0x10), try int(u16, 0)("0x10")); | ||
| 78 | try std.testing.expectEqual(@as(u16, 0b10), try int(u16, 0)("0b10")); | ||
| 79 | |||
| 80 | try std.testing.expectEqual(std.fmt.ParseIntError.InvalidCharacter, int(u8, 10)("-10")); | ||
| 87 | } | 81 | } |
| 88 | 82 | ||
| 89 | /// A parser that uses `std.fmt.parseFloat` to parse the string into an float value. | 83 | /// A parser that uses `std.fmt.parseFloat` to parse the string into an float value. |