aboutsummaryrefslogtreecommitdiff
path: root/src/cli.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli.rs')
-rw-r--r--src/cli.rs92
1 files changed, 77 insertions, 15 deletions
diff --git a/src/cli.rs b/src/cli.rs
index 151286d1..64c25596 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -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");