aboutsummaryrefslogtreecommitdiff
path: root/src/cli.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli.rs')
-rw-r--r--src/cli.rs180
1 files changed, 178 insertions, 2 deletions
diff --git a/src/cli.rs b/src/cli.rs
index d13f059e..30f11a0e 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -8,8 +8,8 @@ use crate::api;
use crate::api::schema::{
EmptyParams, Method, OutputMatch, PaneAgentState, PaneListParams, PaneReadParams,
PaneSendKeysParams, PaneSendTextParams, PaneSplitParams, PaneTarget, PaneWaitForOutputParams,
- ReadSource, Request, SplitDirection, Subscription, WorkspaceCreateParams,
- WorkspaceRenameParams, WorkspaceTarget,
+ ReadSource, Request, SplitDirection, Subscription, TabCreateParams, TabListParams, TabRenameParams,
+ TabTarget, WorkspaceCreateParams, WorkspaceRenameParams, WorkspaceTarget,
};
pub enum CommandOutcome {
@@ -24,6 +24,7 @@ pub fn maybe_run(args: &[String]) -> std::io::Result<CommandOutcome> {
let exit_code = match command {
"workspace" => run_workspace_command(&args[2..])?,
+ "tab" => run_tab_command(&args[2..])?,
"pane" => run_pane_command(&args[2..])?,
"wait" => run_wait_command(&args[2..])?,
"integration" => run_integration_command(&args[2..])?,
@@ -53,6 +54,26 @@ fn run_workspace_command(args: &[String]) -> std::io::Result<i32> {
}
}
+fn run_tab_command(args: &[String]) -> std::io::Result<i32> {
+ let Some(subcommand) = args.first().map(|arg| arg.as_str()) else {
+ print_tab_help();
+ return Ok(2);
+ };
+
+ match subcommand {
+ "list" => tab_list(&args[1..]),
+ "create" => tab_create(&args[1..]),
+ "get" => tab_get(&args[1..]),
+ "focus" => tab_focus(&args[1..]),
+ "rename" => tab_rename(&args[1..]),
+ "close" => tab_close(&args[1..]),
+ _ => {
+ print_tab_help();
+ Ok(2)
+ }
+ }
+}
+
fn run_pane_command(args: &[String]) -> std::io::Result<i32> {
let Some(subcommand) = args.first().map(|arg| arg.as_str()) else {
print_pane_help();
@@ -220,6 +241,147 @@ fn workspace_close(args: &[String]) -> std::io::Result<i32> {
})?)
}
+fn tab_list(args: &[String]) -> std::io::Result<i32> {
+ let mut workspace_id = None;
+
+ let mut index = 0;
+ while index < args.len() {
+ match args[index].as_str() {
+ "--workspace" => {
+ let Some(value) = args.get(index + 1) else {
+ eprintln!("missing value for --workspace");
+ return Ok(2);
+ };
+ workspace_id = Some(normalize_workspace_id(value));
+ index += 2;
+ }
+ other => {
+ eprintln!("unknown option: {other}");
+ return Ok(2);
+ }
+ }
+ }
+
+ print_response(&send_request(&Request {
+ id: "cli:tab:list".into(),
+ method: Method::TabList(TabListParams { workspace_id }),
+ })?)
+}
+
+fn tab_create(args: &[String]) -> std::io::Result<i32> {
+ let mut workspace_id = None;
+ let mut cwd = None;
+ let mut focus = true;
+
+ let mut index = 0;
+ while index < args.len() {
+ match args[index].as_str() {
+ "--workspace" => {
+ let Some(value) = args.get(index + 1) else {
+ eprintln!("missing value for --workspace");
+ return Ok(2);
+ };
+ workspace_id = Some(normalize_workspace_id(value));
+ index += 2;
+ }
+ "--cwd" => {
+ let Some(value) = args.get(index + 1) else {
+ eprintln!("missing value for --cwd");
+ return Ok(2);
+ };
+ cwd = Some(value.clone());
+ index += 2;
+ }
+ "--no-focus" => {
+ focus = false;
+ index += 1;
+ }
+ other => {
+ eprintln!("unknown option: {other}");
+ return Ok(2);
+ }
+ }
+ }
+
+ print_response(&send_request(&Request {
+ id: "cli:tab:create".into(),
+ method: Method::TabCreate(TabCreateParams {
+ workspace_id,
+ cwd,
+ focus,
+ }),
+ })?)
+}
+
+fn tab_get(args: &[String]) -> std::io::Result<i32> {
+ let Some(raw_tab_id) = args.first() else {
+ eprintln!("usage: herdr tab get <tab_id>");
+ return Ok(2);
+ };
+ if args.len() != 1 {
+ eprintln!("usage: herdr tab get <tab_id>");
+ return Ok(2);
+ }
+
+ print_response(&send_request(&Request {
+ id: "cli:tab:get".into(),
+ method: Method::TabGet(TabTarget {
+ tab_id: normalize_tab_id(raw_tab_id),
+ }),
+ })?)
+}
+
+fn tab_focus(args: &[String]) -> std::io::Result<i32> {
+ let Some(raw_tab_id) = args.first() else {
+ eprintln!("usage: herdr tab focus <tab_id>");
+ return Ok(2);
+ };
+ if args.len() != 1 {
+ eprintln!("usage: herdr tab focus <tab_id>");
+ return Ok(2);
+ }
+
+ print_response(&send_request(&Request {
+ id: "cli:tab:focus".into(),
+ method: Method::TabFocus(TabTarget {
+ tab_id: normalize_tab_id(raw_tab_id),
+ }),
+ })?)
+}
+
+fn tab_rename(args: &[String]) -> std::io::Result<i32> {
+ if args.len() < 2 {
+ eprintln!("usage: herdr tab rename <tab_id> <label>");
+ return Ok(2);
+ }
+
+ print_response(&send_request(&Request {
+ id: "cli:tab:rename".into(),
+ method: Method::TabRename(TabRenameParams {
+ tab_id: normalize_tab_id(&args[0]),
+ label: args[1..].join(" "),
+ }),
+ })?)
+}
+
+fn tab_close(args: &[String]) -> std::io::Result<i32> {
+ let Some(raw_tab_id) = args.first() else {
+ eprintln!("usage: herdr tab close <tab_id>");
+ return Ok(2);
+ };
+ if args.len() != 1 {
+ eprintln!("usage: herdr tab close <tab_id>");
+ return Ok(2);
+ }
+
+ print_response(&send_request(&Request {
+ id: "cli:tab:close".into(),
+ method: Method::TabClose(TabTarget {
+ tab_id: normalize_tab_id(raw_tab_id),
+ }),
+ })?)
+}
+
fn pane_list(args: &[String]) -> std::io::Result<i32> {
let mut workspace_id = None;
@@ -832,6 +994,10 @@ fn normalize_workspace_id(value: &str) -> String {
value.to_string()
}
+fn normalize_tab_id(value: &str) -> String {
+ value.to_string()
+}
+
fn normalize_pane_id(value: &str) -> String {
value.to_string()
}
@@ -890,6 +1056,16 @@ fn print_workspace_help() {
eprintln!(" herdr workspace close <workspace_id>");
}
+fn print_tab_help() {
+ eprintln!("herdr tab commands:");
+ eprintln!(" herdr tab list [--workspace <workspace_id>]");
+ eprintln!(" herdr tab create [--workspace <workspace_id>] [--cwd PATH] [--no-focus]");
+ eprintln!(" herdr tab get <tab_id>");
+ eprintln!(" herdr tab focus <tab_id>");
+ eprintln!(" herdr tab rename <tab_id> <label>");
+ eprintln!(" herdr tab close <tab_id>");
+}
+
fn print_pane_help() {
eprintln!("herdr pane commands:");
eprintln!(" herdr pane list [--workspace <workspace_id>]");