use std::io::IsTerminal;
use miette::IntoDiagnostic;
use crate::{height, width, ColWidth, Size};
pub const DEFAULT_WIDTH: u16 = 80;
#[must_use]
pub fn get_terminal_width_no_default() -> Option<ColWidth> {
match get_size() {
Ok(size) => Some(size.col_width),
Err(_) => None,
}
}
#[must_use]
pub fn get_terminal_width() -> ColWidth {
match get_size() {
Ok(size) => size.col_width,
Err(_) => width(DEFAULT_WIDTH),
}
}
pub fn get_size() -> miette::Result<Size> {
let (columns, rows) = crossterm::terminal::size().into_diagnostic()?;
Ok(width(columns) + height(rows))
}
#[derive(Debug)]
pub enum StdinIsPipedResult {
StdinIsPiped,
StdinIsNotPiped,
}
#[derive(Debug)]
pub enum StdoutIsPipedResult {
StdoutIsPiped,
StdoutIsNotPiped,
}
#[must_use]
pub fn is_stdin_piped() -> StdinIsPipedResult {
if std::io::stdin().is_terminal() {
StdinIsPipedResult::StdinIsNotPiped
} else {
StdinIsPipedResult::StdinIsPiped
}
}
#[must_use]
pub fn is_stdout_piped() -> StdoutIsPipedResult {
if std::io::stdout().is_terminal() {
StdoutIsPipedResult::StdoutIsNotPiped
} else {
StdoutIsPipedResult::StdoutIsPiped
}
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum TTYResult {
IsInteractive,
IsNotInteractive,
}
#[must_use]
pub fn is_fully_interactive_terminal() -> TTYResult {
let is_tty: bool = std::io::stdin().is_terminal();
if is_tty {
TTYResult::IsInteractive
} else {
TTYResult::IsNotInteractive
}
}
#[must_use]
pub fn is_fully_uninteractive_terminal() -> TTYResult {
#[cfg(target_os = "windows")]
if std::env::var("CARGO").is_ok() || std::env::var("CARGO_PKG_NAME").is_ok() {
return TTYResult::IsInteractive;
}
let stdin_is_tty: bool = std::io::stdin().is_terminal();
let stdout_is_tty: bool = std::io::stdout().is_terminal();
let stderr_is_tty: bool = std::io::stderr().is_terminal();
if !stdin_is_tty && !stdout_is_tty && !stderr_is_tty {
TTYResult::IsNotInteractive
} else {
TTYResult::IsInteractive
}
}
#[macro_export]
macro_rules! return_if_not_interactive_terminal {
($result:expr) => {
if let TTYResult::IsNotInteractive =
$crate::term::is_fully_uninteractive_terminal()
{
return $result;
}
};
() => {
if let TTYResult::IsNotInteractive =
$crate::term::is_fully_uninteractive_terminal()
{
return;
}
};
}