diff options
Diffstat (limited to 'src/cli.rs')
| -rw-r--r-- | src/cli.rs | 92 |
1 files changed, 77 insertions, 15 deletions
@@ -22,6 +22,8 @@ mod worktree; const TERMINAL_SESSION_OBSERVE_USAGE: &str = "usage: herdr terminal session observe <target> [--cols N] [--rows N]"; +const TERMINAL_SESSION_CONTROL_USAGE: &str = + "usage: herdr terminal session control <target> [--takeover] [--cols N] [--rows N]"; pub(crate) fn parse_env_assignment(raw: &str) -> Result<(String, String), String> { let Some((key, value)) = raw.split_once('=') else { @@ -482,66 +484,125 @@ fn terminal_attach(args: &[String]) -> std::io::Result<i32> { fn terminal_session(args: &[String]) -> std::io::Result<i32> { match args.first().map(|arg| arg.as_str()) { + Some("control") => terminal_session_control(&args[1..]), Some("observe") => terminal_session_observe(&args[1..]), Some("help" | "--help" | "-h") => { + eprintln!("{TERMINAL_SESSION_CONTROL_USAGE}"); eprintln!("{TERMINAL_SESSION_OBSERVE_USAGE}"); Ok(0) } _ => { + eprintln!("{TERMINAL_SESSION_CONTROL_USAGE}"); eprintln!("{TERMINAL_SESSION_OBSERVE_USAGE}"); Ok(2) } } } +fn terminal_session_control(args: &[String]) -> std::io::Result<i32> { + let options = match parse_terminal_session_options( + args, + TERMINAL_SESSION_CONTROL_USAGE, + "control", + true, + )? { + Ok(options) => options, + Err(code) => return Ok(code), + }; + + crate::client::run_terminal_session_control( + options.target, + options.takeover, + options.cols, + options.rows, + )?; + Ok(0) +} + fn terminal_session_observe(args: &[String]) -> std::io::Result<i32> { + let options = match parse_terminal_session_options( + args, + TERMINAL_SESSION_OBSERVE_USAGE, + "observe", + false, + )? { + Ok(options) => options, + Err(code) => return Ok(code), + }; + + crate::client::run_terminal_session_observe(options.target, options.cols, options.rows)?; + Ok(0) +} + +struct TerminalSessionOptions { + target: String, + cols: u16, + rows: u16, + takeover: bool, +} + +fn parse_terminal_session_options( + args: &[String], + usage: &str, + command: &str, + allow_takeover: bool, +) -> std::io::Result<Result<TerminalSessionOptions, i32>> { if matches!( args.first().map(|arg| arg.as_str()), Some("help" | "--help" | "-h") ) { - eprintln!("{TERMINAL_SESSION_OBSERVE_USAGE}"); - return Ok(0); + eprintln!("{usage}"); + return Ok(Err(0)); } let Some(target) = args.first() else { - eprintln!("{TERMINAL_SESSION_OBSERVE_USAGE}"); - return Ok(2); + eprintln!("{usage}"); + return Ok(Err(2)); }; let mut cols = 120; let mut rows = 40; + let mut takeover = false; let mut i = 1; while i < args.len() { match args[i].as_str() { + "--takeover" if allow_takeover => { + takeover = true; + i += 1; + } "--cols" => { let Some(value) = args.get(i + 1) else { - eprintln!("{TERMINAL_SESSION_OBSERVE_USAGE}"); - return Ok(2); + eprintln!("{usage}"); + return Ok(Err(2)); }; cols = parse_terminal_dimension(value, "--cols")?; i += 2; } "--rows" => { let Some(value) = args.get(i + 1) else { - eprintln!("{TERMINAL_SESSION_OBSERVE_USAGE}"); - return Ok(2); + eprintln!("{usage}"); + return Ok(Err(2)); }; rows = parse_terminal_dimension(value, "--rows")?; i += 2; } "help" | "--help" | "-h" => { - eprintln!("{TERMINAL_SESSION_OBSERVE_USAGE}"); - return Ok(0); + eprintln!("{usage}"); + return Ok(Err(0)); } other => { - eprintln!("unknown terminal session observe option: {other}"); - eprintln!("{TERMINAL_SESSION_OBSERVE_USAGE}"); - return Ok(2); + eprintln!("unknown terminal session {command} option: {other}"); + eprintln!("{usage}"); + return Ok(Err(2)); } } } - crate::client::run_terminal_session_observe(target.clone(), cols, rows)?; - Ok(0) + Ok(Ok(TerminalSessionOptions { + target: target.clone(), + cols, + rows, + takeover, + })) } fn parse_terminal_dimension(raw: &str, flag: &str) -> std::io::Result<u16> { @@ -1000,6 +1061,7 @@ fn print_config_help() { fn print_terminal_help() { eprintln!("herdr terminal commands:"); eprintln!(" herdr terminal attach <terminal_id> [--takeover]"); + eprintln!(" herdr terminal session control <target> [--takeover] [--cols N] [--rows N]"); eprintln!(" herdr terminal session observe <target> [--cols N] [--rows N]"); eprintln!(" herdr terminal title set <title>"); eprintln!(" herdr terminal title clear"); |
