From 043b804c44665b07bd503fdad896bbe0a29311a0 Mon Sep 17 00:00:00 2001 From: Can Celik Date: Thu, 10 Sep 2026 23:33:27 +0300 Subject: feat: route cli commands to saved ssh machines (#3918) --- src/main.rs | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index cf7cf5b4..87f3ce0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -482,6 +482,23 @@ where .collect() } +fn finish_cli(outcome: io::Result) -> io::Result<()> { + match outcome { + Ok(cli::CommandOutcome::Handled(code)) => std::process::exit(code), + Ok(cli::CommandOutcome::NotCli) => Ok(()), + Err(err) if cli::protocol_mismatch_was_reported(&err) => std::process::exit(1), + Err(err) if cli::server_not_running_was_reported(&err) => { + if let Some(response) = cli::server_not_running_reported_response(&err) { + if let Ok(json) = serde_json::to_string(response) { + eprintln!("{json}"); + } + } + std::process::exit(1); + } + Err(err) => Err(err), + } +} + fn main() -> io::Result<()> { let raw_args: Vec = match args_as_utf8(std::env::args_os()) { Ok(args) => args, @@ -491,6 +508,9 @@ fn main() -> io::Result<()> { std::process::exit(2); } }; + if let Some(outcome) = cli::maybe_run_machine(&raw_args) { + return finish_cli(outcome); + } let args = match session::configure_from_args(&raw_args) { Ok(args) => args, Err(err) => { @@ -522,19 +542,10 @@ fn main() -> io::Result<()> { std::process::exit(2); } - match cli::maybe_run(&args) { - Ok(cli::CommandOutcome::Handled(code)) => std::process::exit(code), - Ok(cli::CommandOutcome::NotCli) => {} - Err(err) if cli::protocol_mismatch_was_reported(&err) => std::process::exit(1), - Err(err) if cli::server_not_running_was_reported(&err) => { - if let Some(response) = cli::server_not_running_reported_response(&err) { - if let Ok(json) = serde_json::to_string(response) { - eprintln!("{json}"); - } - } - std::process::exit(1); - } - Err(err) => return Err(err), + finish_cli(cli::maybe_run(&args))?; + + if args.get(1).map(String::as_str) == Some("remote-api-bridge") { + return remote::run_remote_api_bridge(&args[2..]); } // Subcommands and flags (no TUI, no logging needed) @@ -585,6 +596,7 @@ fn main() -> io::Result<()> { println!(); println!("Usage: herdr [options]"); println!(" herdr --session [options]"); + println!(" herdr --machine "); println!(" herdr --remote [--session ]"); println!(" herdr session attach "); println!(" herdr completion zsh"); @@ -678,6 +690,7 @@ fn main() -> io::Result<()> { println!(); println!("Options:"); println!(" --session Use or create a named persistent session"); + println!(" --machine Run an API command on a saved SSH machine"); println!(" --remote Attach through SSH to a remote Herdr server"); println!(" --remote-keybindings "); println!(" Keybindings for --remote app attach (default: local)"); @@ -717,6 +730,7 @@ fn main() -> io::Result<()> { // Reject unknown flags let known_flags = [ "--session", + "--machine", "--remote", "--remote-keybindings", "--version", -- cgit v1.2.3