From 544c7ebebbc1db65a2949642d367edc446ae559b Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Thu, 2 Apr 2026 23:59:54 +0300 Subject: feat: add tabs to socket api --- src/cli.rs | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 178 insertions(+), 2 deletions(-) (limited to 'src/cli.rs') 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 { 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 { } } +fn run_tab_command(args: &[String]) -> std::io::Result { + 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 { 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 { })?) } +fn tab_list(args: &[String]) -> std::io::Result { + 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 { + 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 { + let Some(raw_tab_id) = args.first() else { + eprintln!("usage: herdr tab get "); + return Ok(2); + }; + if args.len() != 1 { + eprintln!("usage: herdr tab get "); + 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 { + let Some(raw_tab_id) = args.first() else { + eprintln!("usage: herdr tab focus "); + return Ok(2); + }; + if args.len() != 1 { + eprintln!("usage: herdr tab focus "); + 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 { + if args.len() < 2 { + eprintln!("usage: herdr tab rename