diff options
| -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, |