diff options
| author | Robert Günzler <r@gnzler.io> | 2026-09-29 00:42:12 +0200 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2026-10-02 10:39:48 +0200 |
| commit | f6ae9f7a3f10873fc16fc3d64549cccb709344a7 (patch) | |
| tree | d64766a0b6a12a534d47de0382b91db337941c9f /src | |
| parent | 9ffcffa27189dcc5fea1986cb9fdfc8ea396602c (diff) | |
| download | site-f6ae9f7a3f10873fc16fc3d64549cccb709344a7.tar.gz | |
support flags taking value
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to '')
| -rw-r--r-- | src/main.zig | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/main.zig b/src/main.zig index 0d9f9a7..7fd9696 100644 --- a/src/main.zig +++ b/src/main.zig @@ -29,11 +29,12 @@ var FORCE: bool = false; var LINK_PREFIX: []const u8 = "/site"; const Cli = struct { - const FlagSet = std.BufSet; + const FlagSet = std.StringHashMapUnmanaged([]const u8); const Flag = struct { name: []const u8, help: []const u8 = "", + takes_value: bool = false, }; const Command = struct { @@ -44,8 +45,8 @@ const Cli = struct { handler: *const fn (io: Io, gpa: Allocator, flags: FlagSet, args: [][]const u8) anyerror!void, fn run(self: Command, io: Io, gpa: Allocator, opts: *std.process.Args.Iterator) !void { - var flags: std.BufSet = .init(gpa); - defer flags.deinit(); + var flags: FlagSet = .empty; + defer flags.deinit(gpa); var args: std.ArrayList([]const u8) = .empty; defer args.deinit(gpa); @@ -56,7 +57,12 @@ const Cli = struct { for (self.flags) |f| if (std.mem.eql(u8, o, f.name)) { - try flags.insert(f.name); + if (f.takes_value) { + const flagval = opts.next() orelse return error.MissingFlagValue; + try flags.put(gpa, f.name, flagval); + } else { + try flags.put(gpa, f.name, ""); + } continue :optLoop; }; for (self.subcommands) |c| @@ -92,11 +98,15 @@ const Cli = struct { }, .{ .name = "serve", + .flags = &.{ + .{ .name = "-l", .takes_value = true }, + .{ .name = "--listen", .takes_value = true }, + }, .handler = &Cli.serve, }, }, .handler = struct { - fn inner(_: Io, _: Allocator, _: std.BufSet, _: [][]const u8) anyerror!void { + fn inner(_: Io, _: Allocator, _: FlagSet, _: [][]const u8) anyerror!void { return Cli.usage(); } }.inner, |