summaryrefslogtreecommitdiff
path: root/clap
diff options
context:
space:
mode:
authorGravatar Valentin Charoux2024-11-14 16:22:40 +0100
committerGravatar Komari Spaghetti2024-11-15 09:35:33 +0100
commit2e58c8e49a0da7075fc66e4ae499b7acc5ea5a3f (patch)
treebcc7c40e0ba39026f5aa1f90a0bbedd375fc2330 /clap
parentfix: add uint parsing function (diff)
downloadzig-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.zig60
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 @@
1pub const default = .{ 1pub 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.
29pub fn int(comptime T: type, comptime base: u8) fn ([]const u8) std.fmt.ParseIntError!T { 29pub 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
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
62test "int" { 40test "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.