From 76b8d6d970131cbb39f574e25231424930ce731c Mon Sep 17 00:00:00 2001 From: Robert Günzler Date: Wed, 23 Sep 2026 13:18:59 +0200 Subject: refactor cli handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Robert Günzler --- src/main.zig | 49 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 15 deletions(-) (limited to 'src') 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; -- cgit 1.4.1