use miette::IntoDiagnostic;
use crate::{height, width, ColWidth, Size};
pub const DEFAULT_WIDTH: u16 = 80;
use std::io::IsTerminal as _;
pub fn get_terminal_width_no_default() -> Option<ColWidth> {
match get_size() {
Ok(size) => Some(size.col_width),
Err(_) => None,
}
}
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,
}
pub fn is_stdin_piped() -> StdinIsPipedResult {
if !std::io::stdin().is_terminal() {
StdinIsPipedResult::StdinIsPiped
} else {
StdinIsPipedResult::StdinIsNotPiped
}
}
pub fn is_stdout_piped() -> StdoutIsPipedResult {
use std::io::IsTerminal as _;
if !std::io::stdout().is_terminal() {
StdoutIsPipedResult::StdoutIsPiped
} else {
StdoutIsPipedResult::StdoutIsNotPiped
}
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum TTYResult {
IsInteractive,
IsNotInteractive,
}
pub fn is_fully_interactive_terminal() -> TTYResult {
let is_tty: bool = std::io::stdin().is_terminal();
match is_tty {
true => TTYResult::IsInteractive,
false => TTYResult::IsNotInteractive,
}
}
pub fn is_fully_uninteractive_terminal() -> TTYResult {
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();
match !stdin_is_tty && !stdout_is_tty && !stderr_is_tty {
true => TTYResult::IsNotInteractive,
false => 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;
}
};
}