aboutsummaryrefslogtreecommitdiff
path: root/vendor/owo-colors/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/owo-colors/src/lib.rs')
-rw-r--r--vendor/owo-colors/src/lib.rs515
1 files changed, 515 insertions, 0 deletions
diff --git a/vendor/owo-colors/src/lib.rs b/vendor/owo-colors/src/lib.rs
new file mode 100644
index 0000000..74a4764
--- /dev/null
+++ b/vendor/owo-colors/src/lib.rs
@@ -0,0 +1,515 @@
+//! |**Quick Links**|[`OwoColorize`](OwoColorize)|[`Style`]|[`StyledList`]|[`github`](https://github.com/jam1garner/owo-colors)|
+//! |-|-|-|-|-|
+//!
+//! ---
+//!
+//! This crate provides [`OwoColorize`](OwoColorize), an extension trait for colorizing a
+//! given type.
+//!
+//! ## Example
+//!
+//! ```rust
+//! use owo_colors::OwoColorize;
+//!
+//! fn main() {
+//! // Foreground colors
+//! println!("My number is {:#x}!", 10.green());
+//! // Background colors
+//! println!("My number is not {}!", 4.on_red());
+//! }
+//! ```
+//!
+//! ## Generically color
+//!
+//! ```rust
+//! use owo_colors::OwoColorize;
+//! use owo_colors::colors::*;
+//!
+//! fn main() {
+//! // Generically color
+//! println!("My number might be {}!", 4.fg::<Black>().bg::<Yellow>());
+//! }
+//! ```
+//!
+//! ## Stylize
+//!
+//! ```rust
+//! use owo_colors::OwoColorize;
+//!
+//! println!("{}", "strikethrough".strikethrough());
+//! ```
+//!
+//! ## Only Style on Supported Terminals
+//!
+//! ```rust
+//! # #[cfg(feature = "supports-color")] {
+//! use owo_colors::{OwoColorize, Stream::Stdout};
+//!
+//! println!(
+//! "{}",
+//! "colored blue if a supported terminal"
+//! .if_supports_color(Stdout, |text| text.bright_blue())
+//! );
+//! # }
+//! ```
+//!
+//! Supports `NO_COLOR`/`FORCE_COLOR` environment variables, checks if it's a tty, checks
+//! if it's running in CI (and thus likely supports color), and checks which terminal is being
+//! used. (Note: requires `supports-colors` feature)
+//!
+//! ## Style Objects
+//!
+//! owo-colors also features the ability to create a [`Style`] object and use it to
+//! apply the same set of colors/effects to any number of things to display.
+//!
+//! ```rust
+//! use owo_colors::{OwoColorize, Style};
+//!
+//! let my_style = Style::new()
+//! .red()
+//! .on_white()
+//! .strikethrough();
+//!
+//! let text = "red text, white background, struck through";
+//! println!("{}", text.style(my_style));
+//! ```
+#![cfg_attr(not(test), no_std)]
+#![cfg_attr(doc_cfg, feature(doc_cfg))]
+#![doc(html_logo_url = "https://jam1.re/img/rust_owo.svg")]
+#![warn(missing_docs)]
+
+pub mod colors;
+mod combo;
+mod dyn_colors;
+mod dyn_styles;
+mod styled_list;
+pub mod styles;
+
+#[cfg(feature = "supports-colors")]
+mod overrides;
+
+#[cfg(feature = "supports-colors")]
+pub(crate) use overrides::OVERRIDE;
+
+use core::fmt;
+use core::marker::PhantomData;
+
+/// A trait for describing a type which can be used with [`FgColorDisplay`](FgColorDisplay) or
+/// [`BgCBgColorDisplay`](BgColorDisplay)
+pub trait Color {
+ /// The ANSI format code for setting this color as the foreground
+ const ANSI_FG: &'static str;
+
+ /// The ANSI format code for setting this color as the background
+ const ANSI_BG: &'static str;
+
+ /// The raw ANSI format for settings this color as the foreground without the ANSI
+ /// delimiters ("\x1b" and "m")
+ const RAW_ANSI_FG: &'static str;
+
+ /// The raw ANSI format for settings this color as the background without the ANSI
+ /// delimiters ("\x1b" and "m")
+ const RAW_ANSI_BG: &'static str;
+
+ #[doc(hidden)]
+ type DynEquivelant: DynColor;
+
+ #[doc(hidden)]
+ const DYN_EQUIVELANT: Self::DynEquivelant;
+
+ #[doc(hidden)]
+ fn into_dyncolors() -> crate::DynColors;
+}
+
+/// A trait describing a runtime-configurable color which can displayed using [`FgDynColorDisplay`](FgDynColorDisplay)
+/// or [`BgDynColorDisplay`](BgDynColorDisplay). If your color will be known at compile time it
+/// is recommended you avoid this.
+pub trait DynColor {
+ /// A function to output a ANSI code to a formatter to set the foreground to this color
+ fn fmt_ansi_fg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
+ /// A function to output a ANSI code to a formatter to set the background to this color
+ fn fmt_ansi_bg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
+
+ /// A function to output a raw ANSI code to a formatter to set the foreground to this color,
+ /// but without including the ANSI delimiters.
+ fn fmt_raw_ansi_fg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
+
+ /// A function to output a raw ANSI code to a formatter to set the background to this color,
+ /// but without including the ANSI delimiters.
+ fn fmt_raw_ansi_bg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
+
+ #[doc(hidden)]
+ fn get_dyncolors_fg(&self) -> DynColors;
+ #[doc(hidden)]
+ fn get_dyncolors_bg(&self) -> DynColors;
+}
+
+/// Transparent wrapper around a type which implements all the formatters the wrapped type does,
+/// with the addition of changing the foreground color. Recommended to be constructed using
+/// [`OwoColorize`](OwoColorize).
+#[repr(transparent)]
+pub struct FgColorDisplay<'a, C: Color, T>(&'a T, PhantomData<C>);
+
+/// Transparent wrapper around a type which implements all the formatters the wrapped type does,
+/// with the addition of changing the background color. Recommended to be constructed using
+/// [`OwoColorize`](OwoColorize).
+#[repr(transparent)]
+pub struct BgColorDisplay<'a, C: Color, T>(&'a T, PhantomData<C>);
+
+/// Wrapper around a type which implements all the formatters the wrapped type does,
+/// with the addition of changing the foreground color. Is not recommended unless compile-time
+/// coloring is not an option.
+pub struct FgDynColorDisplay<'a, Color: DynColor, T>(&'a T, Color);
+
+/// Wrapper around a type which implements all the formatters the wrapped type does,
+/// with the addition of changing the background color. Is not recommended unless compile-time
+/// coloring is not an option.
+pub struct BgDynColorDisplay<'a, Color: DynColor, T>(&'a T, Color);
+
+macro_rules! style_methods {
+ ($(#[$meta:meta] $name:ident $ty:ident),* $(,)?) => {
+ $(
+ #[$meta]
+ #[must_use]
+ #[inline(always)]
+ fn $name<'a>(&'a self) -> styles::$ty<'a, Self> {
+ styles::$ty(self)
+ }
+ )*
+ };
+}
+
+const _: () = (); // workaround for syntax highlighting bug
+
+macro_rules! color_methods {
+ ($(
+ #[$fg_meta:meta] #[$bg_meta:meta] $color:ident $fg_method:ident $bg_method:ident
+ ),* $(,)?) => {
+ $(
+ #[$fg_meta]
+ #[must_use]
+ #[inline(always)]
+ fn $fg_method<'a>(&'a self) -> FgColorDisplay<'a, colors::$color, Self> {
+ FgColorDisplay(self, PhantomData)
+ }
+
+ #[$bg_meta]
+ #[must_use]
+ #[inline(always)]
+ fn $bg_method<'a>(&'a self) -> BgColorDisplay<'a, colors::$color, Self> {
+ BgColorDisplay(self, PhantomData)
+ }
+ )*
+ };
+}
+
+const _: () = (); // workaround for syntax highlighting bug
+
+/// Extension trait for colorizing a type which implements any std formatter
+/// ([`Display`](core::fmt::Display), [`Debug`](core::fmt::Debug), [`UpperHex`](core::fmt::UpperHex),
+/// etc.)
+///
+/// ## Example
+///
+/// ```rust
+/// use owo_colors::OwoColorize;
+///
+/// println!("My number is {:#x}!", 10.green());
+/// println!("My number is not {}!", 4.on_red());
+/// ```
+///
+/// ## How to decide which method to use
+///
+/// **Do you have a specific color you want to use?**
+///
+/// Use the specific color's method, such as [`blue`](OwoColorize::blue) or
+/// [`on_green`](OwoColorize::on_green).
+///
+///
+/// **Do you want your colors configurable via generics?**
+///
+/// Use [`fg`](OwoColorize::fg) and [`bg`](OwoColorize::bg) to make it compile-time configurable.
+///
+///
+/// **Do you need to pick a color at runtime?**
+///
+/// Use the [`color`](OwoColorize::color), [`on_color`](OwoColorize::on_color),
+/// [`truecolor`](OwoColorize::truecolor) or [`on_truecolor`](OwoColorize::on_truecolor).
+///
+/// **Do you need some other text modifier?**
+///
+/// * [`bold`](OwoColorize::bold)
+/// * [`dimmed`](OwoColorize::dimmed)
+/// * [`italic`](OwoColorize::italic)
+/// * [`underline`](OwoColorize::underline)
+/// * [`blink`](OwoColorize::blink)
+/// * [`blink_fast`](OwoColorize::blink_fast)
+/// * [`reversed`](OwoColorize::reversed)
+/// * [`hidden`](OwoColorize::hidden)
+/// * [`strikethrough`](OwoColorize::strikethrough)
+///
+/// **Do you want it to only display colors if it's a terminal?**
+///
+/// 1. Enable the `supports-colors` feature
+/// 2. Colorize inside [`if_supports_color`](OwoColorize::if_supports_color)
+///
+/// **Do you need to store a set of colors/effects to apply to multiple things?**
+///
+/// Use [`style`](OwoColorize::style) to apply a [`Style`]
+///
+pub trait OwoColorize: Sized {
+ /// Set the foreground color generically
+ ///
+ /// ```rust
+ /// use owo_colors::{OwoColorize, colors::*};
+ ///
+ /// println!("{}", "red foreground".fg::<Red>());
+ /// ```
+ #[must_use]
+ #[inline(always)]
+ fn fg<C: Color>(&self) -> FgColorDisplay<'_, C, Self> {
+ FgColorDisplay(self, PhantomData)
+ }
+
+ /// Set the background color generically.
+ ///
+ /// ```rust
+ /// use owo_colors::{OwoColorize, colors::*};
+ ///
+ /// println!("{}", "black background".bg::<Black>());
+ /// ```
+ #[must_use]
+ #[inline(always)]
+ fn bg<C: Color>(&self) -> BgColorDisplay<'_, C, Self> {
+ BgColorDisplay(self, PhantomData)
+ }
+
+ color_methods! {
+ /// Change the foreground color to black
+ /// Change the background color to black
+ Black black on_black,
+ /// Change the foreground color to red
+ /// Change the background color to red
+ Red red on_red,
+ /// Change the foreground color to green
+ /// Change the background color to green
+ Green green on_green,
+ /// Change the foreground color to yellow
+ /// Change the background color to yellow
+ Yellow yellow on_yellow,
+ /// Change the foreground color to blue
+ /// Change the background color to blue
+ Blue blue on_blue,
+ /// Change the foreground color to magenta
+ /// Change the background color to magenta
+ Magenta magenta on_magenta,
+ /// Change the foreground color to purple
+ /// Change the background color to purple
+ Magenta purple on_purple,
+ /// Change the foreground color to cyan
+ /// Change the background color to cyan
+ Cyan cyan on_cyan,
+ /// Change the foreground color to white
+ /// Change the background color to white
+ White white on_white,
+
+ /// Change the foreground color to the terminal default
+ /// Change the background color to the terminal default
+ Default default_color on_default_color,
+
+ /// Change the foreground color to bright black
+ /// Change the background color to bright black
+ BrightBlack bright_black on_bright_black,
+ /// Change the foreground color to bright red
+ /// Change the background color to bright red
+ BrightRed bright_red on_bright_red,
+ /// Change the foreground color to bright green
+ /// Change the background color to bright green
+ BrightGreen bright_green on_bright_green,
+ /// Change the foreground color to bright yellow
+ /// Change the background color to bright yellow
+ BrightYellow bright_yellow on_bright_yellow,
+ /// Change the foreground color to bright blue
+ /// Change the background color to bright blue
+ BrightBlue bright_blue on_bright_blue,
+ /// Change the foreground color to bright magenta
+ /// Change the background color to bright magenta
+ BrightMagenta bright_magenta on_bright_magenta,
+ /// Change the foreground color to bright purple
+ /// Change the background color to bright purple
+ BrightMagenta bright_purple on_bright_purple,
+ /// Change the foreground color to bright cyan
+ /// Change the background color to bright cyan
+ BrightCyan bright_cyan on_bright_cyan,
+ /// Change the foreground color to bright white
+ /// Change the background color to bright white
+ BrightWhite bright_white on_bright_white,
+ }
+
+ style_methods! {
+ /// Make the text bold
+ bold BoldDisplay,
+ /// Make the text dim
+ dimmed DimDisplay,
+ /// Make the text italicized
+ italic ItalicDisplay,
+ /// Make the text italicized
+ underline UnderlineDisplay,
+ /// Make the text blink
+ blink BlinkDisplay,
+ /// Make the text blink (but fast!)
+ blink_fast BlinkFastDisplay,
+ /// Swap the foreground and background colors
+ reversed ReversedDisplay,
+ /// Hide the text
+ hidden HiddenDisplay,
+ /// Cross out the text
+ strikethrough StrikeThroughDisplay,
+ }
+
+ /// Set the foreground color at runtime. Only use if you do not know which color will be used at
+ /// compile-time. If the color is constant, use either [`OwoColorize::fg`](OwoColorize::fg) or
+ /// a color-specific method, such as [`OwoColorize::green`](OwoColorize::green),
+ ///
+ /// ```rust
+ /// use owo_colors::{OwoColorize, AnsiColors};
+ ///
+ /// println!("{}", "green".color(AnsiColors::Green));
+ /// ```
+ #[must_use]
+ #[inline(always)]
+ fn color<Color: DynColor>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self> {
+ FgDynColorDisplay(self, color)
+ }
+
+ /// Set the background color at runtime. Only use if you do not know what color to use at
+ /// compile-time. If the color is constant, use either [`OwoColorize::bg`](OwoColorize::bg) or
+ /// a color-specific method, such as [`OwoColorize::on_yellow`](OwoColorize::on_yellow),
+ ///
+ /// ```rust
+ /// use owo_colors::{OwoColorize, AnsiColors};
+ ///
+ /// println!("{}", "yellow background".on_color(AnsiColors::BrightYellow));
+ /// ```
+ #[must_use]
+ #[inline(always)]
+ fn on_color<Color: DynColor>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self> {
+ BgDynColorDisplay(self, color)
+ }
+
+ /// Set the foreground color to a specific RGB value.
+ #[must_use]
+ fn fg_rgb<const R: u8, const G: u8, const B: u8>(
+ &self,
+ ) -> FgColorDisplay<'_, colors::CustomColor<R, G, B>, Self> {
+ FgColorDisplay(self, PhantomData)
+ }
+
+ /// Set the background color to a specific RGB value.
+ #[must_use]
+ fn bg_rgb<const R: u8, const G: u8, const B: u8>(
+ &self,
+ ) -> BgColorDisplay<'_, colors::CustomColor<R, G, B>, Self> {
+ BgColorDisplay(self, PhantomData)
+ }
+
+ /// Sets the foreground color to an RGB value.
+ #[must_use]
+ #[inline(always)]
+ fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self> {
+ FgDynColorDisplay(self, Rgb(r, g, b))
+ }
+
+ /// Sets the background color to an RGB value.
+ #[must_use]
+ #[inline(always)]
+ fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self> {
+ BgDynColorDisplay(self, Rgb(r, g, b))
+ }
+
+ /// Apply a runtime-determined style
+ #[must_use]
+ fn style(&self, style: Style) -> Styled<&Self> {
+ style.style(self)
+ }
+
+ /// Apply a given transformation function to all formatters if the given stream
+ /// supports at least basic ANSI colors, allowing you to conditionally apply
+ /// given styles/colors.
+ ///
+ /// Requires the `supports-colors` feature.
+ ///
+ /// ```rust
+ /// use owo_colors::{OwoColorize, Stream};
+ ///
+ /// println!(
+ /// "{}",
+ /// "woah! error! if this terminal supports colors, it's blue"
+ /// .if_supports_color(Stream::Stdout, |text| text.bright_blue())
+ /// );
+ /// ```
+ #[must_use]
+ #[cfg(feature = "supports-colors")]
+ fn if_supports_color<'a, Out, ApplyFn>(
+ &'a self,
+ stream: Stream,
+ apply: ApplyFn,
+ ) -> SupportsColorsDisplay<'a, Self, Out, ApplyFn>
+ where
+ ApplyFn: Fn(&'a Self) -> Out,
+ {
+ SupportsColorsDisplay(self, apply, stream)
+ }
+}
+
+#[cfg(feature = "supports-colors")]
+mod supports_colors;
+
+#[cfg(feature = "supports-colors")]
+pub use {
+ overrides::{set_override, unset_override},
+ supports_color::Stream,
+ supports_colors::SupportsColorsDisplay,
+};
+
+pub use colors::{
+ ansi_colors::AnsiColors, css::dynamic::CssColors, dynamic::Rgb, xterm::dynamic::XtermColors,
+};
+
+// TODO: figure out some wait to only implement for fmt::Display | fmt::Debug | ...
+impl<D: Sized> OwoColorize for D {}
+
+pub use {combo::ComboColorDisplay, dyn_colors::*, dyn_styles::*};
+
+/// Module for drop-in [`colored`](https://docs.rs/colored) support to aid in porting code from
+/// [`colored`](https://docs.rs/colored) to owo-colors.
+///
+/// Just replace:
+///
+/// ```rust
+/// # mod colored {}
+/// use colored::*;
+/// ```
+///
+/// with
+///
+/// ```rust
+/// use owo_colors::colored::*;
+/// ```
+pub mod colored {
+ pub use crate::AnsiColors as Color;
+ pub use crate::OwoColorize;
+
+ /// A couple of functions to enable and disable coloring similarly to `colored`
+ #[cfg(feature = "supports-colors")]
+ pub mod control {
+ pub use crate::{set_override, unset_override};
+ }
+}
+
+pub use styled_list::StyledList;
+#[cfg(feature = "alloc")]
+pub use styled_list::StyledVec;
+
+#[cfg(test)]
+mod tests;