summaryrefslogtreecommitdiffstats
path: root/third_party/rust/clap_builder/src/builder/styling.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--third_party/rust/clap_builder/src/builder/styling.rs179
1 files changed, 179 insertions, 0 deletions
diff --git a/third_party/rust/clap_builder/src/builder/styling.rs b/third_party/rust/clap_builder/src/builder/styling.rs
new file mode 100644
index 0000000000..3a034489b9
--- /dev/null
+++ b/third_party/rust/clap_builder/src/builder/styling.rs
@@ -0,0 +1,179 @@
+//! 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
+ }
+}