use crate::FocusMode;
use crate::activate;
use std::process::Command;
pub fn try_focus(tty_device: &str, mode: FocusMode) -> bool {
let output = Command::new("wezterm")
.args(["cli", "list", "--format", "json"])
.output();
let Ok(out) = output else { return false };
if !out.status.success() {
return false;
}
let Ok(panes) = serde_json::from_slice::<Vec<serde_json::Value>>(&out.stdout) else {
return false;
};
let tty_full = format!("/dev/{tty_device}");
for pane in panes {
let Some(tty_name) = pane.get("tty_name").and_then(|v| v.as_str()) else {
continue;
};
if tty_name == tty_full || tty_name.ends_with(tty_device) {
let Some(pane_id) = pane.get("pane_id").and_then(|v| v.as_i64()) else {
continue;
};
let result = Command::new("wezterm")
.args(["cli", "activate-pane", "--pane-id", &pane_id.to_string()])
.status();
if result.map(|s| s.success()).unwrap_or(false) {
return bring_to_front(mode);
}
}
}
false
}
fn bring_to_front(mode: FocusMode) -> bool {
match mode {
FocusMode::SingleWindow => bring_to_front_single_window(),
FocusMode::ActivateApp => {
activate::window("WezTerm");
true
}
}
}
#[cfg(target_os = "macos")]
fn bring_to_front_single_window() -> bool {
super::jxa::raise_focused_window("WezTerm")
}
#[cfg(not(target_os = "macos"))]
fn bring_to_front_single_window() -> bool {
activate::window("WezTerm");
true
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_try_focus_nonexistent_tty_single_window() {
let result = try_focus("ttys999999", FocusMode::SingleWindow);
assert!(!result);
}
#[test]
fn test_try_focus_nonexistent_tty_activate_app() {
let result = try_focus("ttys999999", FocusMode::ActivateApp);
assert!(!result);
}
#[test]
fn test_json_parsing() {
let json = r#"[
{"pane_id": 0, "tty_name": "/dev/ttys001", "window_id": 0},
{"pane_id": 1, "tty_name": "/dev/ttys002", "window_id": 0}
]"#;
let panes: Vec<serde_json::Value> = serde_json::from_str(json).unwrap();
assert_eq!(panes.len(), 2);
assert_eq!(panes[0]["pane_id"], 0);
assert_eq!(panes[0]["tty_name"], "/dev/ttys001");
}
}