axl_lib/multiplexer/
mod.rs1use 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}