From b7619db085eb4054a071b51159eda65d6b60f3fe Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Sat, 6 Jun 2026 00:41:19 +0300 Subject: feat: expose pane zoom api --- src/cli/pane.rs | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 2 deletions(-) (limited to 'src/cli') diff --git a/src/cli/pane.rs b/src/cli/pane.rs index 1a9b20e1..3fb83248 100644 --- a/src/cli/pane.rs +++ b/src/cli/pane.rs @@ -2,8 +2,8 @@ use crate::api::schema::{ Method, PaneDirection, PaneEdgesParams, PaneFocusDirectionParams, PaneLayoutParams, PaneListParams, PaneNeighborParams, PaneReadParams, PaneRenameParams, PaneReportAgentParams, PaneReportMetadataParams, PaneResizeParams, PaneSendInputParams, PaneSendKeysParams, - PaneSendTextParams, PaneSplitParams, PaneSwapParams, PaneTarget, ReadFormat, ReadSource, - Request, + PaneSendTextParams, PaneSplitParams, PaneSwapParams, PaneTarget, PaneZoomMode, PaneZoomParams, + ReadFormat, ReadSource, Request, }; pub(super) fn run_pane_command(args: &[String]) -> std::io::Result { @@ -20,6 +20,7 @@ pub(super) fn run_pane_command(args: &[String]) -> std::io::Result { "edges" => pane_edges(&args[1..]), "focus" => pane_focus(&args[1..]), "resize" => pane_resize(&args[1..]), + "zoom" => pane_zoom(&args[1..]), "read" => pane_read(&args[1..]), "rename" => pane_rename(&args[1..]), "split" => pane_split(&args[1..]), @@ -289,6 +290,78 @@ fn parse_pane_resize_args(args: &[String]) -> Result { }) } +fn pane_zoom(args: &[String]) -> std::io::Result { + let params = match parse_pane_zoom_args(args) { + Ok(params) => params, + Err(message) => { + eprintln!("{message}"); + return Ok(2); + } + }; + + super::print_response(&super::send_request(&Request { + id: "cli:pane:zoom".into(), + method: Method::PaneZoom(params), + })?) +} + +fn parse_pane_zoom_args(args: &[String]) -> Result { + let mut pane_id = None; + let mut mode = PaneZoomMode::Toggle; + let mut mode_seen = false; + + let mut index = 0; + if args + .first() + .is_some_and(|arg| !arg.as_str().starts_with("--")) + { + pane_id = args.first().map(|arg| super::normalize_pane_id(arg)); + index = 1; + } + while index < args.len() { + match args[index].as_str() { + "--pane" => { + let Some(value) = args.get(index + 1) else { + return Err("missing value for --pane".into()); + }; + pane_id = Some(super::normalize_pane_id(value)); + index += 2; + } + "--current" => { + pane_id = None; + index += 1; + } + "--toggle" => { + if mode_seen { + return Err("provide only one of --toggle, --on, or --off".into()); + } + mode = PaneZoomMode::Toggle; + mode_seen = true; + index += 1; + } + "--on" => { + if mode_seen { + return Err("provide only one of --toggle, --on, or --off".into()); + } + mode = PaneZoomMode::On; + mode_seen = true; + index += 1; + } + "--off" => { + if mode_seen { + return Err("provide only one of --toggle, --on, or --off".into()); + } + mode = PaneZoomMode::Off; + mode_seen = true; + index += 1; + } + other => return Err(format!("unknown option: {other}")), + } + } + + Ok(PaneZoomParams { pane_id, mode }) +} + fn pane_rename(args: &[String]) -> std::io::Result { let Some(raw_pane_id) = args.first() else { eprintln!("usage: herdr pane rename