╭ changed ──────╮ │src/command.zig│ ╰───────────────╯ ╭───────────────────────────────────────────╮ │1 const std = @import("std"); │ │2 const srv = @import("./serve.zig"); │ │3 +const ssh = @import("./ssh_helper.zig");│ │4 │ │5 pub const CommandKind = enum { │ │6 serve, │ ╰───────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮ │190 /// if any additional allocation needs to be done, the arena inside the cmd args will be used.│ │191 pub const Command = union(CommandKind) { │ │192 serve: srv.Options, │ │192 - ssh_helper: struct { │ │193 - ssh_connect: []const u8, │ │194 - service: ?[]const u8, │ │195 - dir: ?[]const u8, │ │196 - }, │ │193 + ssh_helper: ssh.Options, │ │194 │ │195 pub fn initMaybe(cmd_args: *CommandArgs) !?Command { │ │196 const command_kind = cmd_args.command_kind orelse return null; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────╮ │199 if (cmd_args.positional_args.len != 0) return null; │ │200 │ │201 var options: srv.Options = .{}; │ │202 + │ │203 if (cmd_args.get("--http-listen")) |val_maybe| { │ │204 options.http_listen = val_maybe orelse return error.HttpListenNeedsValue;│ │205 } │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │219 .ssh_helper => { │ │220 if (cmd_args.positional_args.len > 1) return null; │ │221 │ │224 - const options: srv.Options = .{}; │ │222 + var options: ssh.Options = .{}; │ │223 │ │226 - return .{ .ssh_helper = .{ │ │227 - .ssh_connect = if (cmd_args.get("--ssh-connect")) |val_maybe| │ │228 - val_maybe orelse options.ssh_listen │ │229 - else │ │230 - return error.SshListenNeedsValue, │ │231 - .service = if (cmd_args.get("--service")) |val_maybe| │ │232 - val_maybe orelse return error.ServiceNeedsValue │ │233 - else │ │234 - null, │ │235 - .dir = if (cmd_args.positional_args.len == 1) cmd_args.positional_args[0] else null, │ │236 - } }; │ │224 + if (cmd_args.get("--ssh-connect")) |val_maybe| { │ │225 + options.ssh_connect = val_maybe orelse return error.SshConnectNeedsValue; │ │226 + } │ │227 + if (cmd_args.get("--service")) |val_maybe| { │ │228 + options.service = val_maybe orelse return error.ServiceNeedsValue; │ │229 + } │ │230 + options.dir = if (cmd_args.positional_args.len == 1) cmd_args.positional_args[0] else null;│ │231 + │ │232 + return .{ .ssh_helper = options }; │ │233 }, │ │234 } │ │235 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───╮ │src/main.zig│ ╰────────────╯ ╭───────────────────────────────────────────────────╮ │ 4 const rp = xit.repo; │ │ 5 const cmd = @import("./command.zig"); │ │ 6 const srv = @import("./serve.zig"); │ │ 7 -const ssh_helper = @import("./ssh_helper.zig");│ │ 7 +const ssh = @import("./ssh_helper.zig"); │ │ 8 │ │ 9 pub const RunOpts = struct { │ │10 out: *std.Io.Writer, │ ╰───────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │77 }, │ │78 .help => |cmd_kind_maybe| try cmd.printHelp(cmd_kind_maybe, run_opts.out), │ │79 .cli => |cli_cmd| switch (cli_cmd) { │ │80 - .serve => { │ │81 - try srv.run(repo_kind, any_repo_opts, io, allocator, cwd_path, .{ │ │82 - .http_listen = cli_cmd.serve.http_listen, │ │83 - .ssh_listen = cli_cmd.serve.ssh_listen, │ │84 - .wui_listen = cli_cmd.serve.wui_listen, │ │85 - .data_dir = cli_cmd.serve.data_dir, │ │86 - .tui = cli_cmd.serve.tui, │ │87 - }, run_opts.err); │ │88 - }, │ │89 - .ssh_helper => { │ │90 - try ssh_helper.run(io, allocator, .{ │ │91 - .ssh_connect = cli_cmd.ssh_helper.ssh_connect, │ │92 - .service = cli_cmd.ssh_helper.service, │ │93 - .dir = cli_cmd.ssh_helper.dir, │ │94 - }, run_opts.environ_map); │ │95 - }, │ │80 + .serve => |options| try srv.run(repo_kind, any_repo_opts, io, allocator, cwd_path, options, run_opts.err),│ │81 + .ssh_helper => |options| try ssh.run(io, allocator, options, run_opts.environ_map), │ │82 }, │ │83 } │ │84 } │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─────────╮ │src/ssh_helper.zig│ ╰──────────────────╯ ╭───────────────────────────────────────────────╮ │ 3 const xit = @import("xit"); │ │ 4 │ │ 5 pub const Options = struct { │ │ 6 - ssh_connect: []const u8, │ │ 7 - service: ?[]const u8, │ │ 8 - dir: ?[]const u8, │ │ 6 + ssh_connect: []const u8 = blk: { │ │ 7 + const srv = @import("./serve.zig");│ │ 8 + const opts: srv.Options = .{}; │ │ 9 + break :blk opts.ssh_listen; │ │10 + }, │ │11 + service: ?[]const u8 = null, │ │12 + dir: ?[]const u8 = null, │ │13 }; │ │14 │ │15 const Service = enum { │ ╰───────────────────────────────────────────────╯