use std::io::IsTerminal;
fn should_be_interactive_inner(
is_tty_in: bool,
is_tty_out: bool,
is_ci: bool,
non_interactive_env: bool,
) -> bool {
if !is_tty_in {
return false;
}
if !is_tty_out {
return false;
}
if is_ci {
return false;
}
if non_interactive_env {
return false;
}
true
}
pub fn should_be_interactive() -> bool {
let is_tty_in = std::io::stdin().is_terminal();
let is_tty_out = std::io::stdout().is_terminal();
let is_ci = std::env::var("CI").is_ok();
let non_interactive_env = std::env::var("TOKMD_NON_INTERACTIVE").is_ok();
should_be_interactive_inner(is_tty_in, is_tty_out, is_ci, non_interactive_env)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_should_be_interactive() {
let _ = should_be_interactive();
}
#[test]
fn test_inner_all_true_returns_true() {
assert!(should_be_interactive_inner(true, true, false, false));
}
#[test]
fn test_inner_stdin_not_tty_returns_false() {
assert!(!should_be_interactive_inner(false, true, false, false));
}
#[test]
fn test_inner_stdout_not_tty_returns_false() {
assert!(!should_be_interactive_inner(true, false, false, false));
}
#[test]
fn test_inner_ci_set_returns_false() {
assert!(!should_be_interactive_inner(true, true, true, false));
}
#[test]
fn test_inner_non_interactive_env_returns_false() {
assert!(!should_be_interactive_inner(true, true, false, true));
}
#[test]
fn test_inner_both_tty_false_returns_false() {
assert!(!should_be_interactive_inner(false, false, false, false));
}
#[test]
fn test_inner_all_blocking_conditions_returns_false() {
assert!(!should_be_interactive_inner(true, true, true, true));
}
}