summaryrefslogtreecommitdiff
path: root/clap
diff options
context:
space:
mode:
authorGravatar Valentin Charoux2024-11-14 04:24:24 +0100
committerGravatar Komari Spaghetti2024-11-15 09:35:33 +0100
commitf91ba757cb8eed4a115d206f8ccb6c52b2ebad7c (patch)
tree9b5e978d0e36f8f7ba1c9add357fc637c31c62f4 /clap
parentchore: Update to latest version of zig (diff)
downloadzig-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')
-rw-r--r--clap/parsers.zig71
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 @@
1pub const default = .{ 1pub 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
37pub 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
45test "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
37test "int" { 62test "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.