#[cfg(not(windows))]
use posish::io::isatty;
#[cfg(unix)]
use std::os::unix::io::AsRawFd;
#[cfg(target_os = "wasi")]
use std::os::wasi::io::AsRawFd;
#[cfg(windows)]
use std::{
fs,
io::{Stderr, StderrLock, Stdin, StdinLock, Stdout, StdoutLock},
net,
};
pub trait IsTerminal {
fn is_terminal(&self) -> bool;
}
#[cfg(not(windows))]
impl<T> IsTerminal for T
where
T: AsRawFd,
{
#[inline]
fn is_terminal(&self) -> bool {
isatty(self)
}
}
#[cfg(windows)]
impl IsTerminal for Stdin {
#[inline]
fn is_terminal(&self) -> bool {
atty::is(atty::Stream::Stdin)
}
}
#[cfg(windows)]
impl<'a> IsTerminal for StdinLock<'a> {
#[inline]
fn is_terminal(&self) -> bool {
atty::is(atty::Stream::Stdin)
}
}
#[cfg(windows)]
impl IsTerminal for Stdout {
#[inline]
fn is_terminal(&self) -> bool {
atty::is(atty::Stream::Stdout)
}
}
#[cfg(windows)]
impl<'a> IsTerminal for StdoutLock<'a> {
#[inline]
fn is_terminal(&self) -> bool {
atty::is(atty::Stream::Stdout)
}
}
#[cfg(windows)]
impl IsTerminal for Stderr {
#[inline]
fn is_terminal(&self) -> bool {
atty::is(atty::Stream::Stderr)
}
}
#[cfg(windows)]
impl<'a> IsTerminal for StderrLock<'a> {
#[inline]
fn is_terminal(&self) -> bool {
atty::is(atty::Stream::Stderr)
}
}
#[cfg(windows)]
impl<'a> IsTerminal for fs::File {
#[inline]
fn is_terminal(&self) -> bool {
false
}
}
#[cfg(windows)]
impl<'a> IsTerminal for net::TcpStream {
#[inline]
fn is_terminal(&self) -> bool {
false
}
}
#[cfg(all(windows, feature = "cap_std_impls"))]
impl<'a> IsTerminal for cap_std::fs::File {
#[inline]
fn is_terminal(&self) -> bool {
false
}
}
#[cfg(all(windows, feature = "cap_std_impls"))]
impl<'a> IsTerminal for cap_std::net::TcpStream {
#[inline]
fn is_terminal(&self) -> bool {
false
}
}