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}