axl_lib/multiplexer/
mod.rs

1use std::path::Path;
2
3use anyhow::Result;
4use clap::ValueEnum;
5use tracing::instrument;
6
7use self::tmux::Tmux;
8
9pub mod tmux;
10
11pub trait Multiplexer {
12    fn open(self, path: &Path, name: &str) -> Result<()>;
13    fn open_existing(self, name: &str) -> Result<()>;
14    fn get_sessions(self) -> Result<Vec<String>>;
15    fn get_current_session(self) -> String;
16    fn kill_sessions(self, sessions: Vec<String>, current_session: &str) -> Result<()>;
17    fn unique_session(self) -> Result<()>;
18}
19
20#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
21pub enum Multiplexers {
22    Tmux,
23}
24
25impl Multiplexer for Multiplexers {
26    #[instrument(skip_all, err)]
27    fn open(self, path: &Path, name: &str) -> Result<()> {
28        match self {
29            Self::Tmux => {
30                Tmux::open(path, name)?;
31            }
32        }
33        Ok(())
34    }
35
36    #[instrument(skip_all, err)]
37    fn open_existing(self, name: &str) -> Result<()> {
38        match self {
39            Self::Tmux => {
40                Tmux::open_existing(name)?;
41            }
42        }
43        Ok(())
44    }
45
46    #[instrument(skip_all)]
47    fn get_sessions(self) -> Result<Vec<String>> {
48        match self {
49            Self::Tmux => Tmux::list_sessions(),
50        }
51    }
52
53    #[instrument(skip_all)]
54    fn get_current_session(self) -> String {
55        match self {
56            Self::Tmux => Tmux::get_current_session(),
57        }
58    }
59
60    #[instrument(skip(self), err)]
61    fn kill_sessions(self, sessions: Vec<String>, current_session: &str) -> Result<()> {
62        match self {
63            Self::Tmux => Tmux::kill_sessions(&sessions, current_session),
64        }
65    }
66
67    #[instrument(skip_all, err)]
68    fn unique_session(self) -> Result<()> {
69        match self {
70            Self::Tmux => Tmux::unique_session(),
71        }
72    }
73}