about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2026-09-23 13:18:59 +0200
committerRobert Günzler <r@gnzler.io>2026-09-23 13:18:59 +0200
commit76b8d6d970131cbb39f574e25231424930ce731c (patch)
tree4ff8bd27a7774111569b9f03ad5f8f12a06e78f3 /src
parent49b668f1988d0c7a70269167bab094b7bfb8a19a (diff)
downloadsite-76b8d6d970131cbb39f574e25231424930ce731c.tar.gz
refactor cli handling
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to 'src')
-rw-r--r--src/main.zig49
1 files changed, 34 insertions, 15 deletions
diff --git a/src/main.zig b/src/main.zig
index 6bb8551..6ec4af6 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -25,35 +25,54 @@ var FORCE: bool = false;
 
 const Cli = struct {
     fn usage() void {
-        std.debug.print("usage: rbc SOURCE TARGET-DIR\n\n", .{});
-        std.debug.print("Writes SOURCE into TARGET-DIR, resolving references to other files in ROOT (= parent dir of SOURCE).\n", .{});
-        std.debug.print("\n", .{});
+        std.debug.print(
+            \\usage: rbc [command] [options]
+            \\
+            \\commands:
+            \\  build [-f, --force] SOURCE-FILE TARGET-DIR
+            \\    builds while resolving references
+            \\
+            \\
+        , .{});
     }
 
     fn run(init: std.process.Init) !void {
         const io = init.io;
         const gpa = init.gpa;
 
-        const args = try init.minimal.args.toSlice(gpa);
-        defer gpa.free(args);
-
         if (init.environ_map.get("RBC_FORCE")) |_| FORCE = true;
 
         // parse options
-        for (args) |arg| {
-            if (std.mem.eql(u8, arg, "help")) return Cli.usage();
-            if (std.mem.eql(u8, arg, "--help")) return Cli.usage();
-            if (std.mem.eql(u8, arg, "-h")) return Cli.usage();
+        var opts = init.minimal.args.iterate();
+        _ = opts.skip();
+        while (opts.next()) |o| {
+            if (std.mem.eql(u8, o, "help")) return Cli.usage();
+            if (std.mem.eql(u8, o, "--help")) return Cli.usage();
+            if (std.mem.eql(u8, o, "-h")) return Cli.usage();
+            if (std.mem.eql(u8, o, "build")) return Cli.build(io, gpa, &opts);
         }
+        return Cli.usage();
+    }
 
-        if (args.len < 3) return Cli.usage();
+    fn build(io: Io, gpa: Allocator, opts: *std.process.Args.Iterator) !void {
+        var args: std.ArrayList([]const u8) = .empty;
+        defer args.deinit(gpa);
+
+        while (opts.next()) |o| {
+            if (std.mem.eql(u8, o, "help")) return Cli.usage();
+            if (std.mem.eql(u8, o, "--help")) return Cli.usage();
+            if (std.mem.eql(u8, o, "-h")) return Cli.usage();
+            if (std.mem.eql(u8, o, "--force")) FORCE = true and continue;
+            if (std.mem.eql(u8, o, "-f")) FORCE = true and continue;
+            try args.append(gpa, o);
+        }
 
-        // TODO: flag handling
+        if (args.items.len < 2) return Cli.usage();
 
-        const source_path = args[1];
-        const target_path = args[2];
+        const source_path = args.items[0];
+        const target_path = args.items[1];
 
-        log.info("target={s} source={s} ", .{ target_path, source_path });
+        log.info("build : target={s} source={s}", .{ target_path, source_path });
 
         // TODO: allow setting custom root path via flags
         const root_path = std.fs.path.dirname(source_path) orelse return error.NoDirname;