1use anyhow::Result;
2use clap::ValueEnum;
3use std::env;
4use std::fmt::Display;
5
6#[derive(ValueEnum, Copy, Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd)]
11pub enum Verbosity {
12 Quiet,
16 NoWarnings,
20 #[default]
24 Normal,
25 Verbose,
29}
30
31impl Display for Verbosity {
32 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33 match self {
34 Self::Quiet => write!(f, "quiet"),
35 Self::NoWarnings => write!(f, "no-warnings"),
36 Self::Normal => write!(f, "normal"),
37 Self::Verbose => write!(f, "verbose"),
38 }
39 }
40}
41
42impl Verbosity {
43 pub fn from_env_var(env_var_name: &str) -> Result<Self> {
48 let env_var = env::var(env_var_name)?;
49 Self::from_str(&env_var, true).map_err(|e| anyhow::anyhow!(e.to_string()))
50 }
51
52 pub fn is_default(&self) -> bool {
54 *self == Verbosity::default()
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use super::Verbosity;
61 use clap::ValueEnum;
62 use std::env;
63
64 #[test]
65 fn verbosity_ord() {
66 use Verbosity::*;
67 assert!(Quiet < NoWarnings);
68 assert!(NoWarnings < Normal);
69 assert!(Normal < Verbose);
70 }
71
72 #[test]
73 fn verbosity_from_str() {
74 use Verbosity::*;
75 assert_eq!(
76 Verbosity::from_str(&Quiet.to_string(), true).unwrap(),
77 Quiet
78 );
79 assert_eq!(
80 Verbosity::from_str(&NoWarnings.to_string(), true).unwrap(),
81 NoWarnings
82 );
83 assert_eq!(
84 Verbosity::from_str(&Normal.to_string(), true).unwrap(),
85 Normal
86 );
87 assert_eq!(
88 Verbosity::from_str(&Verbose.to_string(), true).unwrap(),
89 Verbose
90 );
91 }
92
93 #[test]
94 fn verbosity_from_env_var() {
95 use Verbosity::*;
96 unsafe {
97 env::set_var("SOME_ENV_VAR", "quiet");
98 }
99 assert_eq!(Verbosity::from_env_var("SOME_ENV_VAR").unwrap(), Quiet);
100 unsafe {
101 env::set_var("SOME_ENV_VAR", "verbose");
102 }
103 assert_eq!(Verbosity::from_env_var("SOME_ENV_VAR").unwrap(), Verbose);
104 unsafe {
105 env::set_var("SOME_ENV_VAR", "no-warnings");
106 }
107 assert_eq!(Verbosity::from_env_var("SOME_ENV_VAR").unwrap(), NoWarnings);
108 assert!(Verbosity::from_env_var("SOME_ENV_VAR_THAT_DOESNT_EXIST").is_err());
109 }
110}