scarb_ui/
verbosity.rs

1use anyhow::Result;
2use clap::ValueEnum;
3use std::env;
4use std::fmt::Display;
5
6/// The requested verbosity of output.
7///
8/// # Ordering
9/// [`Verbosity::Quiet`] < [`Verbosity::NoWarnings`] < [`Verbosity::Normal`] < [`Verbosity::Verbose`]
10#[derive(ValueEnum, Copy, Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd)]
11pub enum Verbosity {
12    /// Avoid printing anything to standard output.
13    ///
14    /// String representation: `quiet`.
15    Quiet,
16    /// Avoid printing warnings to standard output.
17    ///
18    /// String representation: `no-warnings`.
19    NoWarnings,
20    /// Default verbosity level.
21    ///
22    /// String representation: `normal`.
23    #[default]
24    Normal,
25    /// Print extra information to standard output.
26    ///
27    /// String representation: `verbose`.
28    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    /// Get the verbosity level from the given environment variable.
44    ///
45    /// Environment variable value is decoding using [`Verbosity::from_str`].
46    /// See [`Verbosity`] variants documentation for valid values.
47    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    /// Check if the verbosity level is the default one.
53    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}