use std::process::Command; use crate::{Session, SessionSource}; pub use error::Error; mod error; #[derive(Debug)] pub struct Tmux { socket_name: String, } impl Tmux { const SESSION_FORMAT: &str = r##"Session( name: "#S", timestamp: Some(#{?session_last_attached,#{session_last_attached},#{session_created}}))"##; pub fn new(socket_name: String) -> Self { Self { socket_name } } } impl SessionSource for Tmux { type Error = Error; type Iter = Vec; fn sessions(&self) -> Result { let output = Command::new("tmux") .arg("-L") .arg(&self.socket_name) .arg("list-sessions") .arg("-F") .arg(Self::SESSION_FORMAT) .output()? .stdout; let sessions = std::str::from_utf8(&output)? .lines() .filter_map(|s| match ron::from_str(s) { Ok(session) => Some(session), Err(err) => { tracing::warn!(?err, "Invalid session format"); None } }) .collect(); Ok(sessions) } }