Skip to main content

torrust_tracker_deployer_lib/presentation/cli/views/
verbosity.rs

1//! Verbosity level control for user output
2//!
3//! This module provides verbosity level configuration and filtering logic
4//! to control the amount of detail shown to users.
5
6/// Verbosity levels for user output
7///
8/// Controls the amount of detail shown to users. Higher verbosity levels include
9/// all output from lower levels.
10///
11/// # Examples
12///
13/// ```rust
14/// use torrust_tracker_deployer_lib::presentation::cli::views::VerbosityLevel;
15///
16/// let level = VerbosityLevel::Normal;
17/// assert!(level >= VerbosityLevel::Quiet);
18/// assert!(level < VerbosityLevel::Verbose);
19/// ```
20#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)]
21pub enum VerbosityLevel {
22    /// No output - suppress all user-facing messages
23    Silent,
24    /// Minimal output - only errors and final results
25    Quiet,
26    /// Default level - essential progress and results
27    #[default]
28    Normal,
29    /// Detailed progress including intermediate steps
30    Verbose,
31    /// Very detailed including decisions and retries
32    VeryVerbose,
33    /// Maximum detail for troubleshooting
34    Debug,
35}
36
37/// Determines what messages should be displayed based on verbosity level
38///
39/// This struct encapsulates verbosity filtering logic, making it testable
40/// independently from output formatting.
41pub(super) struct VerbosityFilter {
42    level: VerbosityLevel,
43}
44
45impl VerbosityFilter {
46    /// Create a new verbosity filter with the specified level
47    pub(super) fn new(level: VerbosityLevel) -> Self {
48        Self { level }
49    }
50
51    /// Check if messages at the given level should be shown
52    pub(super) fn should_show(&self, required_level: VerbosityLevel) -> bool {
53        self.level >= required_level
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[test]
62    fn it_should_show_only_quiet_messages_when_filter_is_set_to_quiet_level() {
63        let filter = VerbosityFilter::new(VerbosityLevel::Quiet);
64
65        assert!(filter.should_show(VerbosityLevel::Quiet));
66        assert!(!filter.should_show(VerbosityLevel::Normal));
67        assert!(!filter.should_show(VerbosityLevel::Verbose));
68    }
69
70    #[test]
71    fn it_should_show_quiet_and_normal_messages_when_filter_is_set_to_normal_level() {
72        let filter = VerbosityFilter::new(VerbosityLevel::Normal);
73
74        assert!(filter.should_show(VerbosityLevel::Quiet));
75        assert!(filter.should_show(VerbosityLevel::Normal));
76        assert!(!filter.should_show(VerbosityLevel::Verbose));
77    }
78
79    #[test]
80    fn it_should_show_messages_up_to_verbose_when_filter_is_set_to_verbose_level() {
81        let filter = VerbosityFilter::new(VerbosityLevel::Verbose);
82
83        assert!(filter.should_show(VerbosityLevel::Quiet));
84        assert!(filter.should_show(VerbosityLevel::Normal));
85        assert!(filter.should_show(VerbosityLevel::Verbose));
86        assert!(!filter.should_show(VerbosityLevel::VeryVerbose));
87    }
88
89    #[test]
90    fn it_should_show_all_messages_when_filter_is_set_to_debug_level() {
91        let filter = VerbosityFilter::new(VerbosityLevel::Debug);
92
93        assert!(filter.should_show(VerbosityLevel::Quiet));
94        assert!(filter.should_show(VerbosityLevel::Normal));
95        assert!(filter.should_show(VerbosityLevel::Verbose));
96        assert!(filter.should_show(VerbosityLevel::VeryVerbose));
97        assert!(filter.should_show(VerbosityLevel::Debug));
98    }
99
100    #[test]
101    fn it_should_order_verbosity_levels_from_quiet_to_debug() {
102        assert!(VerbosityLevel::Quiet < VerbosityLevel::Normal);
103        assert!(VerbosityLevel::Normal < VerbosityLevel::Verbose);
104        assert!(VerbosityLevel::Verbose < VerbosityLevel::VeryVerbose);
105        assert!(VerbosityLevel::VeryVerbose < VerbosityLevel::Debug);
106    }
107
108    #[test]
109    fn it_should_default_to_normal_level_when_using_default() {
110        let level = VerbosityLevel::default();
111
112        assert_eq!(level, VerbosityLevel::Normal);
113    }
114
115    #[test]
116    fn it_should_compare_equal_when_verbosity_levels_are_same() {
117        assert_eq!(VerbosityLevel::Normal, VerbosityLevel::Normal);
118    }
119
120    #[test]
121    fn it_should_compare_not_equal_when_verbosity_levels_are_different() {
122        assert_ne!(VerbosityLevel::Normal, VerbosityLevel::Verbose);
123    }
124
125    #[test]
126    fn it_should_support_ordering_comparisons_with_greater_or_equal() {
127        let normal = VerbosityLevel::Normal;
128
129        assert!(normal >= VerbosityLevel::Quiet);
130        assert!(normal >= VerbosityLevel::Normal);
131    }
132
133    #[test]
134    fn it_should_support_ordering_comparisons_with_less_than() {
135        let normal = VerbosityLevel::Normal;
136
137        assert!(normal < VerbosityLevel::Verbose);
138    }
139}