summaryrefslogtreecommitdiff
path: root/src/subcommand.zig
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2022-04-25 05:09:55 +0300
committerGravatar Uko Kokņevičs2022-04-25 23:34:05 +0300
commitd303b53f2ced75703bf022a5d337ee3ba530b288 (patch)
treef2e64057120d01ee8a821596ea01b8fc37c53c2c /src/subcommand.zig
downloadzup-d303b53f2ced75703bf022a5d337ee3ba530b288.tar.gz
zup-d303b53f2ced75703bf022a5d337ee3ba530b288.tar.xz
zup-d303b53f2ced75703bf022a5d337ee3ba530b288.zip
Initial commit0.1.0
Diffstat (limited to 'src/subcommand.zig')
-rw-r--r--src/subcommand.zig70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/subcommand.zig b/src/subcommand.zig
new file mode 100644
index 0000000..ebd57ed
--- /dev/null
+++ b/src/subcommand.zig
@@ -0,0 +1,70 @@
1const clap = @import("clap");
2const std = @import("std");
3const zup = @import("zup");
4
5const Allocator = std.mem.Allocator;
6const ArgIterator = std.process.ArgIterator;
7
8const parsers = .{
9 .COMMAND = clap.parsers.string,
10 .NAME = clap.parsers.string,
11};
12
13pub fn SubCommand(comptime template: type) type {
14 return struct {
15 pub const base = template;
16
17 const params = clap.parseParamsComptime(
18 \\-H, --help Display this help and exit
19 \\-V, --version Display the version of Zup and exit
20 \\
21 ++ template.params);
22
23 pub fn help(name: []const u8) !void {
24 const writer = std.io.getStdErr().writer();
25 try writer.print("USAGE: zup {s} ", .{name});
26 try clap.usage(writer, clap.Help, &params);
27 try writer.writeAll("\n\n");
28 try clap.help(writer, clap.Help, &params, .{
29 .description_on_new_line = false,
30 .description_indent = 0,
31 .indent = 2,
32 .max_width = 120,
33 .spacing_between_parameters = 0,
34 });
35 try writer.writeAll("\n" ++ template.description ++ "\n");
36 }
37
38 pub fn main(name: []const u8, allocator: Allocator, args: *ArgIterator) !void {
39 var diag = clap.Diagnostic{};
40 var res = clap.parseEx(clap.Help, &params, parsers, args, .{
41 .allocator = allocator,
42 .diagnostic = &diag,
43 }) catch |err| {
44 diag.report(std.io.getStdErr().writer(), err) catch {};
45 try help(name);
46 return err;
47 };
48 defer res.deinit();
49
50 if (res.args.help) {
51 return help(name);
52 }
53
54 if (res.args.version) {
55 return zup.printVersion();
56 }
57
58 if (res.positionals.len < template.min_args or res.positionals.len > template.max_args) {
59 try help(name);
60 return error.ArgError;
61 }
62
63 return template.main(
64 clap.ResultEx(clap.Help, &params, parsers),
65 allocator,
66 res,
67 );
68 }
69 };
70}