diff options
| author | 2024-11-14 04:24:24 +0100 | |
|---|---|---|
| committer | 2024-11-15 09:35:33 +0100 | |
| commit | f91ba757cb8eed4a115d206f8ccb6c52b2ebad7c (patch) | |
| tree | 9b5e978d0e36f8f7ba1c9add357fc637c31c62f4 /clap/parsers.zig | |
| parent | chore: Update to latest version of zig (diff) | |
| download | zig-clap-f91ba757cb8eed4a115d206f8ccb6c52b2ebad7c.tar.gz zig-clap-f91ba757cb8eed4a115d206f8ccb6c52b2ebad7c.tar.xz zig-clap-f91ba757cb8eed4a115d206f8ccb6c52b2ebad7c.zip | |
fix: add uint parsing function
In order to get the more precise `ParseIntError.InvalidCharacter` error
instead of `ParseIntError.Overflow` when a negative number is passed to
a usize, uX typed argument, I use the `fmt.parseUnsigned` function.
Diffstat (limited to 'clap/parsers.zig')
| -rw-r--r-- | clap/parsers.zig | 71 |
1 files changed, 54 insertions, 17 deletions
diff --git a/clap/parsers.zig b/clap/parsers.zig index 2bf8976..334c639 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 = int(u8, 0), | 4 | .u8 = uint(u8, 0), |
| 5 | .u16 = int(u16, 0), | 5 | .u16 = uint(u16, 0), |
| 6 | .u32 = int(u32, 0), | 6 | .u32 = uint(u32, 0), |
| 7 | .u64 = int(u64, 0), | 7 | .u64 = uint(u64, 0), |
| 8 | .usize = int(usize, 0), | 8 | .usize = uint(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), |
| @@ -34,19 +34,56 @@ pub fn int(comptime T: type, comptime base: u8) fn ([]const u8) std.fmt.ParseInt | |||
| 34 | }.parse; | 34 | }.parse; |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 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 | |||
| 37 | test "int" { | 62 | test "int" { |
| 38 | try std.testing.expectEqual(@as(u8, 0), try int(u8, 10)("0")); | 63 | try std.testing.expectEqual(@as(i8, 0), try int(i8, 10)("0")); |
| 39 | try std.testing.expectEqual(@as(u8, 1), try int(u8, 10)("1")); | 64 | try std.testing.expectEqual(@as(i8, 1), try int(i8, 10)("1")); |
| 40 | try std.testing.expectEqual(@as(u8, 10), try int(u8, 10)("10")); | 65 | try std.testing.expectEqual(@as(i8, 10), try int(i8, 10)("10")); |
| 41 | try std.testing.expectEqual(@as(u8, 0b10), try int(u8, 2)("10")); | 66 | try std.testing.expectEqual(@as(i8, 0b10), try int(i8, 2)("10")); |
| 42 | try std.testing.expectEqual(@as(u8, 0x10), try int(u8, 0)("0x10")); | 67 | try std.testing.expectEqual(@as(i8, 0x10), try int(i8, 0)("0x10")); |
| 43 | try std.testing.expectEqual(@as(u8, 0b10), try int(u8, 0)("0b10")); | 68 | try std.testing.expectEqual(@as(i8, 0b10), try int(i8, 0)("0b10")); |
| 44 | try std.testing.expectEqual(@as(u16, 0), try int(u16, 10)("0")); | 69 | try std.testing.expectEqual(@as(i16, 0), try int(i16, 10)("0")); |
| 45 | try std.testing.expectEqual(@as(u16, 1), try int(u16, 10)("1")); | 70 | try std.testing.expectEqual(@as(i16, 1), try int(i16, 10)("1")); |
| 46 | try std.testing.expectEqual(@as(u16, 10), try int(u16, 10)("10")); | 71 | try std.testing.expectEqual(@as(i16, 10), try int(i16, 10)("10")); |
| 47 | try std.testing.expectEqual(@as(u16, 0b10), try int(u16, 2)("10")); | 72 | try std.testing.expectEqual(@as(i16, 0b10), try int(i16, 2)("10")); |
| 48 | try std.testing.expectEqual(@as(u16, 0x10), try int(u16, 0)("0x10")); | 73 | try std.testing.expectEqual(@as(i16, 0x10), try int(i16, 0)("0x10")); |
| 49 | try std.testing.expectEqual(@as(u16, 0b10), try int(u16, 0)("0b10")); | 74 | try std.testing.expectEqual(@as(i16, 0b10), try int(i16, 0)("0b10")); |
| 75 | 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")); | ||
| 77 | try std.testing.expectEqual(@as(i8, -10), try int(i8, 10)("-10")); | ||
| 78 | try std.testing.expectEqual(@as(i8, -0b10), try int(i8, 2)("-10")); | ||
| 79 | try std.testing.expectEqual(@as(i8, -0x10), try int(i8, 0)("-0x10")); | ||
| 80 | try std.testing.expectEqual(@as(i8, -0b10), try int(i8, 0)("-0b10")); | ||
| 81 | try std.testing.expectEqual(@as(i16, 0), try int(i16, 10)("-0")); | ||
| 82 | try std.testing.expectEqual(@as(i16, -1), try int(i16, 10)("-1")); | ||
| 83 | try std.testing.expectEqual(@as(i16, -10), try int(i16, 10)("-10")); | ||
| 84 | 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")); | ||
| 86 | try std.testing.expectEqual(@as(i16, -0b10), try int(i16, 0)("-0b10")); | ||
| 50 | } | 87 | } |
| 51 | 88 | ||
| 52 | /// A parser that uses `std.fmt.parseFloat` to parse the string into an float value. | 89 | /// A parser that uses `std.fmt.parseFloat` to parse the string into an float value. |