use std::collections::HashMap; use crate::api::schema::{TabCreateParams, TabListParams, TabRenameParams}; pub(super) 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..]), "help" | "--help" | "-h" => { print_tab_help(); Ok(0) } _ => { print_tab_help(); Ok(2) } } } 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(super::normalize_workspace_id(value)); index += 2; } other => { eprintln!("unknown option: {other}"); return Ok(2); } } } super::runtime::tab_list(TabListParams { workspace_id }) } fn tab_create(args: &[String]) -> std::io::Result { let mut workspace_id = None; let mut cwd = None; let mut focus = false; let mut label = None; let mut env = HashMap::new(); 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(super::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; } "--label" => { let Some(value) = args.get(index + 1) else { eprintln!("missing value for --label"); return Ok(2); }; label = Some(value.clone()); index += 2; } "--focus" => { focus = true; index += 1; } "--no-focus" => { focus = false; index += 1; } "--env" => { let Some(value) = args.get(index + 1) else { eprintln!("missing value for --env"); return Ok(2); }; let (key, value) = match super::parse_env_assignment(value) { Ok(pair) => pair, Err(err) => { eprintln!("{err}"); return Ok(2); } }; env.insert(key, value); index += 2; } other => { eprintln!("unknown option: {other}"); return Ok(2); } } } super::runtime::tab_create(TabCreateParams { workspace_id, cwd, focus, label, env, }) } 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); } super::runtime::tab_get(super::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); } super::runtime::tab_focus(super::normalize_tab_id(raw_tab_id)) } fn tab_rename(args: &[String]) -> std::io::Result { if args.len() < 2 { eprintln!("usage: herdr tab rename