remux/src/util.rs

76 lines
1.7 KiB
Rust
Raw Normal View History

use std::{
env::current_dir,
io::{ stdout, IsTerminal },
path::PathBuf,
process::exit
};
2023-04-06 13:34:32 -04:00
use tmux_interface::{
Session, Tmux,
commands,
variables::session::SessionsCtl
2023-04-06 13:34:32 -04:00
};
use crate::{
env,
error
};
/// return a Vec of all sessions or None
2023-04-06 13:34:32 -04:00
pub fn get_sessions() -> Option<Vec<Session>> {
let sessions = SessionsCtl::new().get_all();
if let Ok(sessions) = sessions {
return Some(sessions.0);
} else { return None; }
2023-04-06 13:34:32 -04:00
}
/// show the tmux nest text if env var is not unset
pub fn prevent_nest() {
if env::tmux() {
2024-06-10 12:02:57 -04:00
println!("To nest sessions, use the -n flag.");
exit(6);
}
}
2024-03-08 10:04:24 -05:00
/// enforce a command is being used in-session
pub fn session_enforce(cmd: &'static str) {
if !env::tmux() { error::not_in_session(cmd); }
2024-03-08 10:04:24 -05:00
}
/// check whether a target session exists
pub fn session_exists<S: Into<String>>(target: S) -> bool {
let has_session = commands::HasSession::new()
.target_session(target.into());
Tmux::new().add_command(has_session)
.status()
.unwrap()
.success()
}
/// enforce a command is being run in a terminal
pub fn terminal_enforce() {
if !stdout().is_terminal() { error::not_terminal(); }
}
/// attempt to return the repo name or exit
pub fn repo_fallback() -> String {
let repo = repo_root(current_dir().unwrap());
if repo.is_none() { error::missing_target(); }
let target = repo.unwrap().file_name().unwrap().to_string_lossy().to_string();
target
}
/// recursively attempt to find a git root directory
pub fn repo_root(path: PathBuf) -> Option<PathBuf> {
// if .git dir is found, return
if path.join(".git").exists() { return Some(path); }
// otherwise, attempt to traverse
let parent = path.parent();
if let Some(parent) = parent { repo_root(parent.to_path_buf()) }
else { None }
}