browser_commander/core/
logger.rs1use tracing::Level;
7use tracing_subscriber::{fmt, prelude::*, EnvFilter};
8
9pub fn is_verbose_enabled() -> bool {
17 std::env::var("VERBOSE").is_ok() || std::env::args().any(|arg| arg == "--verbose")
18}
19
20#[derive(Debug, Clone, Default)]
22pub struct LoggerOptions {
23 pub verbose: bool,
25}
26
27pub fn init_logger(options: LoggerOptions) {
43 let level = if options.verbose {
44 Level::DEBUG
45 } else {
46 Level::ERROR
47 };
48
49 let filter = EnvFilter::from_default_env().add_directive(level.into());
50
51 let subscriber = fmt::layer().with_target(true).with_level(true);
52
53 tracing_subscriber::registry()
54 .with(filter)
55 .with(subscriber)
56 .try_init()
57 .ok(); }
59
60#[derive(Debug, Clone)]
62pub struct Logger {
63 verbose: bool,
64}
65
66impl Logger {
67 pub fn new(options: LoggerOptions) -> Self {
73 Self {
74 verbose: options.verbose,
75 }
76 }
77
78 pub fn debug<F>(&self, mut message_fn: F)
85 where
86 F: FnMut() -> String,
87 {
88 if self.verbose {
89 let msg = message_fn();
90 tracing::debug!("{}", msg);
91 }
92 }
93
94 pub fn error(&self, message: &str) {
100 tracing::error!("{}", message);
101 }
102
103 pub fn info(&self, message: &str) {
109 tracing::info!("{}", message);
110 }
111
112 pub fn warn(&self, message: &str) {
118 tracing::warn!("{}", message);
119 }
120
121 pub fn is_verbose(&self) -> bool {
123 self.verbose
124 }
125}
126
127impl Default for Logger {
128 fn default() -> Self {
129 Self {
130 verbose: is_verbose_enabled(),
131 }
132 }
133}
134
135#[cfg(test)]
136mod tests {
137 use super::*;
138
139 #[test]
140 fn logger_default_is_not_verbose() {
141 std::env::remove_var("VERBOSE");
144 let logger = Logger::default();
145 assert!(!logger.is_verbose() || is_verbose_enabled());
148 }
149
150 #[test]
151 fn logger_can_be_created_with_verbose_true() {
152 let logger = Logger::new(LoggerOptions { verbose: true });
153 assert!(logger.is_verbose());
154 }
155
156 #[test]
157 fn logger_can_be_created_with_verbose_false() {
158 let logger = Logger::new(LoggerOptions { verbose: false });
159 assert!(!logger.is_verbose());
160 }
161
162 #[test]
163 fn logger_options_default_is_not_verbose() {
164 let options = LoggerOptions::default();
165 assert!(!options.verbose);
166 }
167
168 #[test]
169 fn debug_message_fn_not_called_when_not_verbose() {
170 let logger = Logger::new(LoggerOptions { verbose: false });
171 let mut was_called = false;
172
173 logger.debug(|| {
174 was_called = true;
175 "test message".to_string()
176 });
177
178 assert!(!was_called);
179 }
180
181 #[test]
182 fn debug_message_fn_called_when_verbose() {
183 let logger = Logger::new(LoggerOptions { verbose: true });
184 let mut was_called = false;
185
186 logger.debug(|| {
187 was_called = true;
188 "test message".to_string()
189 });
190
191 assert!(was_called);
192 }
193}