╭ changed ──────╮ │src/command.zig│ ╰───────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │20 , │ │21 .example = │ │22 \\haxy serve --http-listen 127.0.0.1:8080 --ssh-listen 127.0.0.1:8022 --wui-listen 127.0.0.1:8000 --data-dir /srv/git│ │23 + \\use "none" for --http-listen or --ssh-listen to disable that service. │ │24 , │ │25 }, │ │26 }; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │183 const command_kind = cmd_args.command_kind orelse return null; │ │184 switch (command_kind) { │ │185 .serve => { │ │185 - if (cmd_args.positional_args.len != 0) return null; │ │186 + return .{ .serve = try serveOptions(cmd_args) orelse return null }; │ │187 + }, │ │188 + } │ │189 + } │ │190 +}; │ │191 │ │187 - var options: srv.Options = .{}; │ │192 +pub fn parseServeOptions(allocator: std.mem.Allocator, args: []const []const u8) !srv.Options { │ │193 + var cmd_args = try CommandArgs.init(allocator, args); │ │194 + defer cmd_args.deinit(); │ │195 + const options = try serveOptions(&cmd_args) orelse return error.InvalidServeArgument; │ │196 + if (cmd_args.unused_args.count() != 0) return error.InvalidServeArgument; │ │197 + return options; │ │198 +} │ │199 │ │189 - if (cmd_args.get("--http-listen")) |val_maybe| { │ │190 - options.http_listen = val_maybe orelse return error.HttpListenNeedsValue; │ │191 - } │ │192 - if (cmd_args.get("--ssh-listen")) |val_maybe| { │ │193 - options.ssh_listen = val_maybe orelse return error.SshListenNeedsValue; │ │194 - } │ │195 - if (cmd_args.get("--wui-listen")) |val_maybe| { │ │196 - options.wui_listen = val_maybe orelse return error.WuiListenNeedsValue; │ │197 - } │ │198 - if (cmd_args.get("--data-dir")) |val_maybe| { │ │199 - options.data_dir = val_maybe orelse return error.DataDirNeedsValue; │ │200 - } │ │200 +fn serveOptions(cmd_args: *CommandArgs) !?srv.Options { │ │201 + if (cmd_args.positional_args.len != 0) return null; │ │202 │ │202 - return .{ .serve = options }; │ │203 - }, │ │204 - } │ │203 + var options: srv.Options = .{}; │ │204 + if (cmd_args.get("--http-listen")) |value_maybe| { │ │205 + const value = value_maybe orelse return error.HttpListenNeedsValue; │ │206 + options.http_listen = if (std.mem.eql(u8, value, "none")) null else value; │ │207 + } │ │208 + if (cmd_args.get("--ssh-listen")) |value_maybe| { │ │209 + const value = value_maybe orelse return error.SshListenNeedsValue; │ │210 + options.ssh_listen = if (std.mem.eql(u8, value, "none")) null else value; │ │211 } │ │206 -}; │ │212 + if (cmd_args.get("--wui-listen")) |value_maybe| options.wui_listen = value_maybe orelse return error.WuiListenNeedsValue;│ │213 + if (cmd_args.get("--data-dir")) |value_maybe| options.data_dir = value_maybe orelse return error.DataDirNeedsValue; │ │214 + return options; │ │215 +} │ │216 │ │217 /// parses the given args into a command if valid, and determines how it should be run │ │218 /// (via the TUI or CLI). │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯