#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![warn(missing_docs)]
#![warn(clippy::print_stderr)]
#![warn(clippy::print_stdout)]
pub mod windows;
#[inline]
pub fn clicolor() -> Option<bool> {
let value = std::env::var_os("CLICOLOR")?;
Some(value != "0")
}
#[inline]
pub fn clicolor_force() -> bool {
non_empty(std::env::var_os("CLICOLOR_FORCE").as_deref())
}
#[inline]
pub fn no_color() -> bool {
non_empty(std::env::var_os("NO_COLOR").as_deref())
}
#[inline]
pub fn term_supports_color() -> bool {
#[cfg(not(windows))]
{
match std::env::var_os("TERM") {
None => return false,
Some(k) => {
if k == "dumb" {
return false;
}
}
}
true
}
#[cfg(windows)]
{
if let Some(k) = std::env::var_os("TERM") {
if k == "dumb" {
return false;
}
}
true
}
}
#[inline]
pub fn term_supports_ansi_color() -> bool {
#[cfg(not(windows))]
{
term_supports_color()
}
#[cfg(windows)]
{
match std::env::var_os("TERM") {
None => return false,
Some(k) => {
if k == "dumb" || k == "cygwin" {
return false;
}
}
}
true
}
}
#[inline]
pub fn truecolor() -> bool {
let value = std::env::var_os("COLORTERM");
let value = value.as_deref().unwrap_or_default();
value == "truecolor" || value == "24bit"
}
#[inline]
pub fn is_ci() -> bool {
std::env::var_os("CI").is_some()
}
fn non_empty(var: Option<&std::ffi::OsStr>) -> bool {
!var.unwrap_or_default().is_empty()
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn non_empty_not_present() {
assert!(!non_empty(None));
}
#[test]
fn non_empty_empty() {
assert!(!non_empty(Some(std::ffi::OsStr::new(""))));
}
#[test]
fn non_empty_texty() {
assert!(non_empty(Some(std::ffi::OsStr::new("hello"))));
}
}