summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/extended.zig60
1 files changed, 54 insertions, 6 deletions
diff --git a/src/extended.zig b/src/extended.zig
index 8fb017f..5fd019d 100644
--- a/src/extended.zig
+++ b/src/extended.zig
@@ -13,14 +13,62 @@ const assert = debug.assert;
13pub const Param = struct { 13pub const Param = struct {
14 field: []const u8, 14 field: []const u8,
15 names: core.Names, 15 names: core.Names,
16 settings: Settings,
16 kind: Kind, 17 kind: Kind,
17 required: bool, 18
18 position: ?usize, 19 pub fn flag(field: []const u8, names: *const core.Names, settings: *const Settings) Param {
20 return Param{
21 .field = field,
22 .names = names.*,
23 .settings = settings.*,
24 .kind = Kind.Flag,
25 };
26 }
27
28 pub fn option(
29 field: []const u8,
30 names: *const core.Names,
31 settings: *const Settings,
32 comptime parser: *const Parser,
33 ) Param {
34 return Param{
35 .field = field,
36 .names = names.*,
37 .settings = settings.*,
38 .kind = Kind{ .Option = parser.* },
39 };
40 }
41
42 pub fn subcommand(
43 field: []const u8,
44 names: *const core.Names,
45 settings: *const Settings,
46 comptime command: *const Command,
47 ) Param {
48 return Param{
49 .field = field,
50 .names = names.*,
51 .settings = settings.*,
52 .kind = Kind{ .Subcommand = Command.* },
53 };
54 }
19 55
20 pub const Kind = union(enum) { 56 pub const Kind = union(enum) {
21 Flag, 57 Flag,
22 Option: Parser, 58 Option: Parser,
23 SubCommand: Command, 59 Subcommand: Command,
60 };
61
62 pub const Settings = struct {
63 required: bool,
64 position: ?usize,
65
66 pub fn default() Settings {
67 return Settings{
68 .required = false,
69 .position = null,
70 };
71 }
24 }; 72 };
25}; 73};
26 74
@@ -116,7 +164,7 @@ pub fn Clap(comptime Result: type) type {
116 var handled = comptime blk: { 164 var handled = comptime blk: {
117 var res: [command.params.len]bool = undefined; 165 var res: [command.params.len]bool = undefined;
118 for (command.params) |p, i| { 166 for (command.params) |p, i| {
119 res[i] = !p.required; 167 res[i] = !p.settings.required;
120 } 168 }
121 169
122 break :blk res; 170 break :blk res;
@@ -145,7 +193,7 @@ pub fn Clap(comptime Result: type) type {
145 arg_loop: 193 arg_loop:
146 while (try clap.next()) |arg| : (pos += 1) { 194 while (try clap.next()) |arg| : (pos += 1) {
147 inline for(command.params) |param, i| { 195 inline for(command.params) |param, i| {
148 if (arg.param.id == i and (param.position ?? pos) == pos) { 196 if (arg.param.id == i and (param.settings.position ?? pos) == pos) {
149 handled[i] = true; 197 handled[i] = true;
150 198
151 switch (param.kind) { 199 switch (param.kind) {
@@ -155,7 +203,7 @@ pub fn Clap(comptime Result: type) type {
155 Param.Kind.Option => |parser| { 203 Param.Kind.Option => |parser| {
156 try parser.parse(getFieldPtr(&result, param.field), ??arg.value); 204 try parser.parse(getFieldPtr(&result, param.field), ??arg.value);
157 }, 205 },
158 Param.Kind.SubCommand => |sub_command| { 206 Param.Kind.Subcommand => |sub_command| {
159 getFieldPtr(&result, param.field).* = try sub_command.parseHelper(Error, clap); 207 getFieldPtr(&result, param.field).* = try sub_command.parseHelper(Error, clap);
160 208
161 // After parsing a subcommand, there should be no arguments left. 209 // After parsing a subcommand, there should be no arguments left.