| //! Terminal [`Styles`] for help and error output |
| |
| pub use anstyle::*; |
| |
| /// Terminal styling definitions |
| /// |
| /// See also [`Command::styles`][crate::Command::styles]. |
| /// |
| /// # Example |
| /// |
| /// clap v3 styling |
| /// ```rust |
| /// # use clap_builder as clap; |
| /// # use clap::builder::styling::*; |
| /// let styles = Styles::styled() |
| /// .header(AnsiColor::Yellow.on_default()) |
| /// .usage(AnsiColor::Green.on_default()) |
| /// .literal(AnsiColor::Green.on_default()) |
| /// .placeholder(AnsiColor::Green.on_default()); |
| /// ``` |
| #[derive(Clone, Debug)] |
| #[allow(missing_copy_implementations)] // Large enough type that I want an explicit `clone()` for now |
| pub struct Styles { |
| header: anstyle::Style, |
| error: anstyle::Style, |
| usage: anstyle::Style, |
| literal: anstyle::Style, |
| placeholder: anstyle::Style, |
| valid: anstyle::Style, |
| invalid: anstyle::Style, |
| } |
| |
| impl Styles { |
| /// No terminal styling |
| pub const fn plain() -> Self { |
| Self { |
| header: anstyle::Style::new(), |
| error: anstyle::Style::new(), |
| usage: anstyle::Style::new(), |
| literal: anstyle::Style::new(), |
| placeholder: anstyle::Style::new(), |
| valid: anstyle::Style::new(), |
| invalid: anstyle::Style::new(), |
| } |
| } |
| |
| /// Default terminal styling |
| pub const fn styled() -> Self { |
| #[cfg(feature = "color")] |
| { |
| Self { |
| header: anstyle::Style::new().bold().underline(), |
| error: anstyle::Style::new() |
| .fg_color(Some(anstyle::Color::Ansi(anstyle::AnsiColor::Red))) |
| .bold(), |
| usage: anstyle::Style::new().bold().underline(), |
| literal: anstyle::Style::new().bold(), |
| placeholder: anstyle::Style::new(), |
| valid: anstyle::Style::new() |
| .fg_color(Some(anstyle::Color::Ansi(anstyle::AnsiColor::Green))), |
| invalid: anstyle::Style::new() |
| .fg_color(Some(anstyle::Color::Ansi(anstyle::AnsiColor::Yellow))), |
| } |
| } |
| #[cfg(not(feature = "color"))] |
| { |
| Self::plain() |
| } |
| } |
| |
| /// General Heading style, e.g. [`help_heading`][crate::Arg::help_heading] |
| #[inline] |
| pub const fn header(mut self, style: anstyle::Style) -> Self { |
| self.header = style; |
| self |
| } |
| |
| /// Error heading |
| #[inline] |
| pub const fn error(mut self, style: anstyle::Style) -> Self { |
| self.error = style; |
| self |
| } |
| |
| /// Usage heading |
| #[inline] |
| pub const fn usage(mut self, style: anstyle::Style) -> Self { |
| self.usage = style; |
| self |
| } |
| |
| /// Literal command-line syntax, e.g. `--help` |
| #[inline] |
| pub const fn literal(mut self, style: anstyle::Style) -> Self { |
| self.literal = style; |
| self |
| } |
| |
| /// Descriptions within command-line syntax, e.g. [`value_name`][crate::Arg::value_name] |
| #[inline] |
| pub const fn placeholder(mut self, style: anstyle::Style) -> Self { |
| self.placeholder = style; |
| self |
| } |
| |
| /// Highlight suggested usage |
| #[inline] |
| pub const fn valid(mut self, style: anstyle::Style) -> Self { |
| self.valid = style; |
| self |
| } |
| |
| /// Highlight invalid usage |
| #[inline] |
| pub const fn invalid(mut self, style: anstyle::Style) -> Self { |
| self.invalid = style; |
| self |
| } |
| } |
| |
| /// Reflection |
| impl Styles { |
| /// General Heading style, e.g. [`help_heading`][crate::Arg::help_heading] |
| #[inline(always)] |
| pub const fn get_header(&self) -> &anstyle::Style { |
| &self.header |
| } |
| |
| /// Error heading |
| #[inline(always)] |
| pub const fn get_error(&self) -> &anstyle::Style { |
| &self.error |
| } |
| |
| /// Usage heading |
| #[inline(always)] |
| pub const fn get_usage(&self) -> &anstyle::Style { |
| &self.usage |
| } |
| |
| /// Literal command-line syntax, e.g. `--help` |
| #[inline(always)] |
| pub const fn get_literal(&self) -> &anstyle::Style { |
| &self.literal |
| } |
| |
| /// Descriptions within command-line syntax, e.g. [`value_name`][crate::Arg::value_name] |
| #[inline(always)] |
| pub const fn get_placeholder(&self) -> &anstyle::Style { |
| &self.placeholder |
| } |
| |
| /// Highlight suggested usage |
| #[inline(always)] |
| pub const fn get_valid(&self) -> &anstyle::Style { |
| &self.valid |
| } |
| |
| /// Highlight invalid usage |
| #[inline(always)] |
| pub const fn get_invalid(&self) -> &anstyle::Style { |
| &self.invalid |
| } |
| } |
| |
| impl super::AppTag for Styles {} |
| |
| impl Default for Styles { |
| fn default() -> Self { |
| Self::styled() |
| } |
| } |
| |
| impl Default for &'_ Styles { |
| fn default() -> Self { |
| const STYLES: Styles = Styles::styled(); |
| &STYLES |
| } |
| } |