1
use clap::Args;
2
use log::LevelFilter;
3

            
4
#[derive(Args, Debug)]
5
pub struct VerbosityFlag {
6
    #[arg(
7
        short,
8
        long,
9
        global = true,
10
        default_value_t = false,
11
        help = "Set the verbosity to quiet"
12
    )]
13
    quiet: bool,
14

            
15
    #[arg(
16
        short,
17
        long,
18
        global = true,
19
        default_value_t = false,
20
        help = "Set the verbosity to verbose (default)"
21
    )]
22
    verbose: bool,
23

            
24
    #[arg(
25
        short,
26
        long,
27
        global = true,
28
        default_value_t = false,
29
        help = "Set the verbosity to debug"
30
    )]
31
    debug: bool,
32

            
33
    #[arg(long, global = true, default_value_t = false, help = "Set the verbosity to trace")]
34
    trace: bool,
35
}
36

            
37
impl VerbosityFlag {
38
    /// Returns the log level filter corresponding to the given verbosity flags.
39
    pub fn log_level_filter(&self) -> LevelFilter {
40
        self.verbosity().log_level_filter()
41
    }
42

            
43
    /// Returns the verbosity level corresponding to the given verbosity flags.
44
    pub fn verbosity(&self) -> Verbosity {
45
        if self.quiet {
46
            Verbosity::Quiet
47
        } else if self.trace {
48
            Verbosity::Trace
49
        } else if self.debug {
50
            Verbosity::Debug
51
        } else if self.verbose {
52
            Verbosity::Verbose
53
        } else {
54
            // Default verbosity level
55
            Verbosity::Verbose
56
        }
57
    }
58
}
59

            
60
#[derive(Debug, Clone)]
61
pub enum Verbosity {
62
    Quiet,
63
    Verbose,
64
    Debug,
65
    Trace,
66
}
67

            
68
impl std::fmt::Display for Verbosity {
69
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70
        match self {
71
            Verbosity::Quiet => write!(f, "quiet"),
72
            Verbosity::Verbose => write!(f, "verbose"),
73
            Verbosity::Debug => write!(f, "debug"),
74
            Verbosity::Trace => write!(f, "trace"),
75
        }
76
    }
77
}
78

            
79
impl Verbosity {
80
    /// Returns the log filter level corresponding to this verbosity.
81
    pub fn log_level_filter(&self) -> LevelFilter {
82
        match self {
83
            Verbosity::Quiet => LevelFilter::Off,
84
            Verbosity::Verbose => LevelFilter::Info,
85
            Verbosity::Debug => LevelFilter::Debug,
86
            Verbosity::Trace => LevelFilter::Trace,
87
        }
88
    }
89
}