colorchoice_clap/
lib.rs

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