diff --git a/clap/parsers.zig b/clap/parsers.zig index 2bf8976..5750308 100644 --- a/clap/parsers.zig +++ b/clap/parsers.zig @@ -24,17 +24,46 @@ test "string" { try std.testing.expectEqualStrings("aa", try string("aa")); } -/// A parser that uses `std.fmt.parseInt` to parse the string into an integer value. -/// See `std.fmt.parseInt` documentation for more information. +/// A parser that uses `std.fmt.parseInt` or `std.fmt.parseUnsigned` to parse the string into an integer value. +/// See `std.fmt.parseInt` and `std.fmt.parseUnsigned` documentation for more information. pub fn int(comptime T: type, comptime base: u8) fn ([]const u8) std.fmt.ParseIntError!T { return struct { fn parse(in: []const u8) std.fmt.ParseIntError!T { - return std.fmt.parseInt(T, in, base); + return switch (@typeInfo(T).int.signedness) { + .signed => std.fmt.parseInt(T, in, base), + .unsigned => std.fmt.parseUnsigned(T, in, base), + }; } }.parse; } test "int" { + try std.testing.expectEqual(@as(i8, 0), try int(i8, 10)("0")); + try std.testing.expectEqual(@as(i8, 1), try int(i8, 10)("1")); + try std.testing.expectEqual(@as(i8, 10), try int(i8, 10)("10")); + try std.testing.expectEqual(@as(i8, 0b10), try int(i8, 2)("10")); + try std.testing.expectEqual(@as(i8, 0x10), try int(i8, 0)("0x10")); + try std.testing.expectEqual(@as(i8, 0b10), try int(i8, 0)("0b10")); + try std.testing.expectEqual(@as(i16, 0), try int(i16, 10)("0")); + try std.testing.expectEqual(@as(i16, 1), try int(i16, 10)("1")); + try std.testing.expectEqual(@as(i16, 10), try int(i16, 10)("10")); + try std.testing.expectEqual(@as(i16, 0b10), try int(i16, 2)("10")); + try std.testing.expectEqual(@as(i16, 0x10), try int(i16, 0)("0x10")); + try std.testing.expectEqual(@as(i16, 0b10), try int(i16, 0)("0b10")); + + try std.testing.expectEqual(@as(i8, 0), try int(i8, 10)("-0")); + try std.testing.expectEqual(@as(i8, -1), try int(i8, 10)("-1")); + try std.testing.expectEqual(@as(i8, -10), try int(i8, 10)("-10")); + try std.testing.expectEqual(@as(i8, -0b10), try int(i8, 2)("-10")); + try std.testing.expectEqual(@as(i8, -0x10), try int(i8, 0)("-0x10")); + try std.testing.expectEqual(@as(i8, -0b10), try int(i8, 0)("-0b10")); + try std.testing.expectEqual(@as(i16, 0), try int(i16, 10)("-0")); + try std.testing.expectEqual(@as(i16, -1), try int(i16, 10)("-1")); + try std.testing.expectEqual(@as(i16, -10), try int(i16, 10)("-10")); + try std.testing.expectEqual(@as(i16, -0b10), try int(i16, 2)("-10")); + try std.testing.expectEqual(@as(i16, -0x10), try int(i16, 0)("-0x10")); + try std.testing.expectEqual(@as(i16, -0b10), try int(i16, 0)("-0b10")); + try std.testing.expectEqual(@as(u8, 0), try int(u8, 10)("0")); try std.testing.expectEqual(@as(u8, 1), try int(u8, 10)("1")); try std.testing.expectEqual(@as(u8, 10), try int(u8, 10)("10")); @@ -47,6 +76,8 @@ test "int" { try std.testing.expectEqual(@as(u16, 0b10), try int(u16, 2)("10")); try std.testing.expectEqual(@as(u16, 0x10), try int(u16, 0)("0x10")); try std.testing.expectEqual(@as(u16, 0b10), try int(u16, 0)("0b10")); + + try std.testing.expectEqual(std.fmt.ParseIntError.InvalidCharacter, int(u8, 10)("-10")); } /// A parser that uses `std.fmt.parseFloat` to parse the string into an float value.