use std::sync::OnceLock;
#[cfg(test)]
use std::sync::Mutex;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum TerminalApp {
AppleTerminal,
Unknown,
}
#[cfg(test)]
static MOCK_APP_OVERRIDE: Mutex<Option<TerminalApp>> = Mutex::new(None);
static TERMINAL_APP: OnceLock<TerminalApp> = OnceLock::new();
fn detect_terminal_app_internal() -> TerminalApp {
use std::env;
if let Ok(program) = env::var("TERM_PROGRAM")
&& program == "Apple_Terminal"
{
return TerminalApp::AppleTerminal;
}
TerminalApp::Unknown
}
#[cfg(test)]
pub(crate) fn force_mock_terminal_app(app: Option<TerminalApp>) {
*MOCK_APP_OVERRIDE.lock().unwrap() = app;
}
pub(crate) fn get_terminal_app() -> TerminalApp {
#[cfg(test)]
{
if let Some(mocked_app) = *MOCK_APP_OVERRIDE.lock().unwrap() {
return mocked_app;
}
}
*TERMINAL_APP.get_or_init(detect_terminal_app_internal)
}