-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(builder): Re-export anstyle for easy access
- Loading branch information
Showing
3 changed files
with
173 additions
and
163 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,166 @@ | ||
//! Terminal [`Styles`] for help and error output | ||
|
||
pub use anstyle::*; | ||
|
||
/// Terminal styling definitions | ||
/// | ||
/// See also [`Command::styles`][crate::Command::styles]. | ||
#[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 | ||
} | ||
} |