aboutsummaryrefslogtreecommitdiff
path: root/vendor/anstyle-query/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/anstyle-query/src/lib.rs')
-rw-r--r--vendor/anstyle-query/src/lib.rs134
1 files changed, 134 insertions, 0 deletions
diff --git a/vendor/anstyle-query/src/lib.rs b/vendor/anstyle-query/src/lib.rs
new file mode 100644
index 0000000..4b3745a
--- /dev/null
+++ b/vendor/anstyle-query/src/lib.rs
@@ -0,0 +1,134 @@
+pub mod windows;
+
+/// Check [CLICOLOR] status
+///
+/// - When `true`, ANSI colors are supported and should be used when the program isn't piped,
+/// similar to [`term_supports_color`]
+/// - When `false`, don’t output ANSI color escape codes, similar to [`no_color`]
+///
+/// See also:
+/// - [terminfo](https://crates.io/crates/terminfo) or [term](https://crates.io/crates/term) for
+/// checking termcaps
+/// - [termbg](https://crates.io/crates/termbg) for detecting background color
+///
+/// [CLICOLOR]: https://bixense.com/clicolors/
+#[inline]
+pub fn clicolor() -> Option<bool> {
+ let value = std::env::var_os("CLICOLOR")?;
+ Some(value != "0")
+}
+
+/// Check [CLICOLOR_FORCE] status
+///
+/// ANSI colors should be enabled no matter what.
+///
+/// [CLICOLOR_FORCE]: https://bixense.com/clicolors/
+#[inline]
+pub fn clicolor_force() -> bool {
+ let value = std::env::var_os("CLICOLOR_FORCE");
+ value
+ .as_deref()
+ .unwrap_or_else(|| std::ffi::OsStr::new("0"))
+ != "0"
+}
+
+/// Check [NO_COLOR] status
+///
+/// When `true`, should prevent the addition of ANSI color.
+///
+/// User-level configuration files and per-instance command-line arguments should override
+/// [NO_COLOR]. A user should be able to export `$NO_COLOR` in their shell configuration file as a
+/// default, but configure a specific program in its configuration file to specifically enable
+/// color.
+///
+/// [NO_COLOR]: https://no-color.org/
+#[inline]
+pub fn no_color() -> bool {
+ let value = std::env::var_os("NO_COLOR");
+ value.as_deref().unwrap_or_else(|| std::ffi::OsStr::new("")) != ""
+}
+
+/// Check `TERM` for color support
+#[inline]
+#[cfg(not(windows))]
+pub fn term_supports_color() -> bool {
+ match std::env::var_os("TERM") {
+ // If TERM isn't set, then we are in a weird environment that
+ // probably doesn't support colors.
+ None => return false,
+ Some(k) => {
+ if k == "dumb" {
+ return false;
+ }
+ }
+ }
+ true
+}
+
+/// Check `TERM` for color support
+#[inline]
+#[cfg(windows)]
+pub fn term_supports_color() -> bool {
+ // On Windows, if TERM isn't set, then we shouldn't automatically
+ // assume that colors aren't allowed. This is unlike Unix environments
+ // where TERM is more rigorously set.
+ if let Some(k) = std::env::var_os("TERM") {
+ if k == "dumb" {
+ return false;
+ }
+ }
+ true
+}
+
+/// Check `TERM` for ANSI color support
+#[inline]
+#[cfg(not(windows))]
+pub fn term_supports_ansi_color() -> bool {
+ term_supports_color()
+}
+
+/// Check `TERM` for ANSI color support
+#[inline]
+#[cfg(windows)]
+pub fn term_supports_ansi_color() -> bool {
+ match std::env::var_os("TERM") {
+ // If TERM isn't set, then we are in a weird environment that
+ // probably doesn't support ansi.
+ None => return false,
+ Some(k) => {
+ // cygwin doesn't seem to support ANSI escape sequences
+ // and instead has its own variety. However, the Windows
+ // console API may be available.
+ if k == "dumb" || k == "cygwin" {
+ return false;
+ }
+ }
+ }
+ true
+}
+
+/// Check [COLORTERM] for truecolor support
+///
+/// [COLORTERM]: https://github.com/termstandard/colors
+#[inline]
+pub fn truecolor() -> bool {
+ let value = std::env::var_os("COLORTERM");
+ let value = value.as_deref().unwrap_or_default();
+ value == "truecolor" || value == "24bit"
+}
+
+/// Report whether this is running in CI
+///
+/// CI is a common environment where, despite being piped, ansi color codes are supported
+///
+/// This is not as exhaustive as you'd find in a crate like `is_ci` but it should work in enough
+/// cases.
+#[inline]
+pub fn is_ci() -> bool {
+ // Assuming its CI based on presence because who would be setting `CI=false`?
+ //
+ // This makes it easier to all of the potential values when considering our known values:
+ // - Gitlab and Github set it to `true`
+ // - Woodpecker sets it to `woodpecker`
+ std::env::var_os("CI").is_some()
+}