clap_color_flag/lib.rs
1//! Control color with a `--color` flag for your CLI
2//!
3//! # Examples
4//!
5//! To get `--color` through your entire program, just `flatten` [`Color`]:
6//! ```rust,no_run
7//! use clap::Parser;
8//! use clap_color_flag::Color;
9//!
10//! /// Le CLI
11//! #[derive(Debug, Parser)]
12//! struct Cli {
13//! #[command(flatten)]
14//! color: Color,
15//! }
16//! ```
17//!
18//! You can then use this to configure your formatter:
19//! ```rust,no_run
20//! use anstream::println;
21//! use owo_colors::OwoColorize as _;
22//! # use clap::Parser;
23//! # use clap_color_flag::Color;
24//! #
25//! # /// Le CLI
26//! # #[derive(Debug, Parser)]
27//! # struct Cli {
28//! # #[command(flatten)]
29//! # color: Color,
30//! # }
31//!
32//! let cli = Cli::parse();
33//!
34//! cli.color.write_global();
35//!
36//! println!("Hello, {}!", "world".red());
37//! ```
38
39#![cfg_attr(docsrs, feature(doc_auto_cfg))]
40
41use clap::ColorChoice;
42
43#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, clap::Args)]
44pub struct Color {
45 /// Controls when to use color.
46 #[arg(
47 long,
48 default_value_t = ColorChoice::Auto,
49 value_name = "WHEN",
50 value_enum,
51 global = true,
52 )]
53 color: ColorChoice,
54}
55
56impl Color {
57 /// Set the user selection on `colorchoice`
58 pub fn write_global(&self) {
59 self.as_choice().write_global();
60 }
61
62 /// Get the user's selection
63 pub fn as_choice(&self) -> colorchoice::ColorChoice {
64 match self.color {
65 ColorChoice::Auto => colorchoice::ColorChoice::Auto,
66 ColorChoice::Always => colorchoice::ColorChoice::Always,
67 ColorChoice::Never => colorchoice::ColorChoice::Never,
68 }
69 }
70}
71
72#[cfg(test)]
73mod test {
74 use super::*;
75
76 #[test]
77 fn verify_app() {
78 #[derive(Debug, clap::Parser)]
79 struct Cli {
80 #[command(flatten)]
81 color: Color,
82 }
83
84 use clap::CommandFactory;
85 Cli::command().debug_assert()
86 }
87}