about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.zig20
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,