#[cfg(windows)]
use std::{
fs,
io::{Stderr, StderrLock, Stdin, StdinLock, Stdout, StdoutLock},
net,
};
#[cfg(not(windows))]
use {io_lifetimes::AsFilelike, rsix::io::isatty};
pub trait IsTerminal {
fn is_terminal(&self) -> bool;
}
#[cfg(not(windows))]
impl<T: AsFilelike> IsTerminal for T {
#[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 IsTerminal for fs::File {
#[inline]
fn is_terminal(&self) -> bool {
false
}
}
#[cfg(windows)]
impl IsTerminal for net::TcpStream {
#[inline]
fn is_terminal(&self) -> bool {
false
}
}
#[cfg(all(windows, feature = "cap_std_impls"))]
impl IsTerminal for cap_std::fs::File {
#[inline]
fn is_terminal(&self) -> bool {
false
}
}
#[cfg(all(windows, feature = "cap_std_impls"))]
impl IsTerminal for cap_std::net::TcpStream {
#[inline]
fn is_terminal(&self) -> bool {
false
}
}
#[cfg(all(windows, feature = "socket2"))]
impl IsTerminal for socket2::Socket {
#[inline]
fn is_terminal(&self) -> bool {
use io_lifetimes::AsSocketlike;
self.as_socketlike_view::<std::net::TcpStream>()
.is_terminal()
}
}