summaryrefslogtreecommitdiff
path: root/clap
diff options
context:
space:
mode:
authorGravatar Jimmi Holst Christensen2022-07-25 18:15:45 +0200
committerGravatar Jimmi Holst Christensen2022-07-25 18:16:19 +0200
commit7f9eabeecfde0d909ab50a8fb10ad3fedff93d03 (patch)
tree0e7ee4f043ef215524ec41062e2442cd00615270 /clap
parentUpdate LICENSE (diff)
downloadzig-clap-7f9eabeecfde0d909ab50a8fb10ad3fedff93d03.tar.gz
zig-clap-7f9eabeecfde0d909ab50a8fb10ad3fedff93d03.tar.xz
zig-clap-7f9eabeecfde0d909ab50a8fb10ad3fedff93d03.zip
Add clap.parsers.enumeration for parsing enums
closes #78
Diffstat (limited to 'clap')
-rw-r--r--clap/parsers.zig37
1 files changed, 37 insertions, 0 deletions
diff --git a/clap/parsers.zig b/clap/parsers.zig
index 49b95a9..208a1aa 100644
--- a/clap/parsers.zig
+++ b/clap/parsers.zig
@@ -1,6 +1,7 @@
1const std = @import("std"); 1const std = @import("std");
2 2
3const fmt = std.fmt; 3const fmt = std.fmt;
4const testing = std.testing;
4 5
5pub const default = .{ 6pub const default = .{
6 .string = string, 7 .string = string,
@@ -23,6 +24,10 @@ pub fn string(in: []const u8) error{}![]const u8 {
23 return in; 24 return in;
24} 25}
25 26
27test "string" {
28 try testing.expectEqualStrings("aa", try string("aa"));
29}
30
26pub fn int(comptime T: type, comptime radix: u8) fn ([]const u8) fmt.ParseIntError!T { 31pub fn int(comptime T: type, comptime radix: u8) fn ([]const u8) fmt.ParseIntError!T {
27 return struct { 32 return struct {
28 fn parse(in: []const u8) fmt.ParseIntError!T { 33 fn parse(in: []const u8) fmt.ParseIntError!T {
@@ -31,6 +36,14 @@ pub fn int(comptime T: type, comptime radix: u8) fn ([]const u8) fmt.ParseIntErr
31 }.parse; 36 }.parse;
32} 37}
33 38
39test "int" {
40 try testing.expectEqual(@as(u8, 0), try int(u8, 10)("0"));
41 try testing.expectEqual(@as(u8, 1), try int(u8, 10)("1"));
42 try testing.expectEqual(@as(u8, 10), try int(u8, 10)("10"));
43 try testing.expectEqual(@as(u8, 0x10), try int(u8, 0)("0x10"));
44 try testing.expectEqual(@as(u8, 0b10), try int(u8, 0)("0b10"));
45}
46
34pub fn float(comptime T: type) fn ([]const u8) fmt.ParseFloatError!T { 47pub fn float(comptime T: type) fn ([]const u8) fmt.ParseFloatError!T {
35 return struct { 48 return struct {
36 fn parse(in: []const u8) fmt.ParseFloatError!T { 49 fn parse(in: []const u8) fmt.ParseFloatError!T {
@@ -39,6 +52,30 @@ pub fn float(comptime T: type) fn ([]const u8) fmt.ParseFloatError!T {
39 }.parse; 52 }.parse;
40} 53}
41 54
55test "float" {
56 try testing.expectEqual(@as(f32, 0), try float(f32)("0"));
57}
58
59pub const EnumError = error{
60 NameNotPartOfEnum,
61};
62
63pub fn enumeration(comptime T: type) fn ([]const u8) EnumError!T {
64 return struct {
65 fn parse(in: []const u8) EnumError!T {
66 return std.meta.stringToEnum(T, in) orelse error.NameNotPartOfEnum;
67 }
68 }.parse;
69}
70
71test "enumeration" {
72 const E = enum { a, b, c };
73 try testing.expectEqual(E.a, try enumeration(E)("a"));
74 try testing.expectEqual(E.b, try enumeration(E)("b"));
75 try testing.expectEqual(E.c, try enumeration(E)("c"));
76 try testing.expectError(EnumError.NameNotPartOfEnum, enumeration(E)("d"));
77}
78
42fn ReturnType(comptime P: type) type { 79fn ReturnType(comptime P: type) type {
43 return @typeInfo(P).Fn.return_type.?; 80 return @typeInfo(P).Fn.return_type.?;
44} 81}