diff options
Diffstat (limited to 'src/tmux.rs')
-rw-r--r-- | src/tmux.rs | 80 |
1 files changed, 15 insertions, 65 deletions
diff --git a/src/tmux.rs b/src/tmux.rs index 88f521f..e1fa3a6 100644 --- a/src/tmux.rs +++ b/src/tmux.rs @@ -2,32 +2,27 @@ use std::process::Command; use crate::Session; +use clap::Args; pub use error::Error; mod error; -#[derive(Debug)] +#[derive(Debug, Clone, Args)] +#[group(skip)] pub struct Tmux { - socket_name: String, + /// tmux socket-name, equivelent to `tmux -L <socket-name>` + #[arg(short = 'L', long = "tmux_socket", default_value = "ssh")] + pub socket: String, } impl Tmux { const SESSION_FORMAT: &str = r##"Session(name: "#S", state: #{?session_last_attached,Attached(#{session_last_attached}),Created(#{session_created})})"##; - pub fn new(socket_name: String) -> Self { - Self { socket_name } - } - - pub fn list(&self, name: Option<String>) -> Result<Vec<Session>, Error> { - let filter = name - .map(|s| vec!["-f".into(), format!("#{{==:#S,{s}}}")]) - .unwrap_or_default(); - + pub fn list(&self) -> Result<Vec<Session>, Error> { let stdout = Command::new("tmux") .arg("-L") - .arg(&self.socket_name) + .arg(&self.socket) .arg("list-sessions") - .args(filter) .arg("-F") .arg(Self::SESSION_FORMAT) .output()? @@ -46,31 +41,13 @@ impl Tmux { Ok(sessions) } - - pub fn host(&self) -> Result<Session, Error> { - let stdout = Command::new("tmux") - .arg("-L") - .arg(&self.socket_name) - .arg("display") - .arg("-p") - .arg("#h") - .output()? - .stdout; - - let name = std::str::from_utf8(&stdout)?.trim().into(); - - Ok(Session { - state: crate::State::LocalHost, - name, - }) - } } #[cfg(test)] mod tests { use super::*; - const SOCKET_NAME: &str = "test"; + const SOCKET: &str = "test"; #[test] fn test_tmux_list() -> Result<(), Error> { @@ -79,52 +56,25 @@ mod tests { for name in names.iter().cloned() { Command::new("tmux") .arg("-L") - .arg(SOCKET_NAME) + .arg(SOCKET) .arg("new-session") .arg("-ds") .arg(name) .status()?; } - let tmux = Tmux::new(SOCKET_NAME.to_owned()); - let sessions: Vec<_> = tmux.list(None)?.into_iter().map(|s| s.name).collect(); - - Command::new("tmux") - .arg("-L") - .arg(SOCKET_NAME) - .arg("kill-server") - .status()?; - - assert_eq!(names, sessions); - - Ok(()) - } - - #[test] - fn test_tmux_host() -> Result<(), Error> { - Command::new("tmux") - .arg("-L") - .arg(SOCKET_NAME) - .arg("new-session") - .arg("-d") - .status()?; - - let name = hostname::get()?.to_string_lossy().into(); - let expected_session = Session { - state: crate::State::LocalHost, - name, + let tmux = Tmux { + socket: SOCKET.to_owned(), }; - - let tmux = Tmux::new(SOCKET_NAME.to_owned()); - let session = tmux.host()?; + let sessions: Vec<_> = tmux.list()?.into_iter().map(|s| s.name).collect(); Command::new("tmux") .arg("-L") - .arg(SOCKET_NAME) + .arg(SOCKET) .arg("kill-server") .status()?; - assert_eq!(expected_session, session); + assert_eq!(names, sessions); Ok(()) } |