umsh_cli/
logger.rs

1//! Log trait for the CLI. The core crate does not depend on `tracing` or
2//! `defmt`; callers that want either plug it in via the trait.
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
5pub enum LogLevel {
6    Error,
7    Warn,
8    Info,
9    Debug,
10    Trace,
11}
12
13pub trait CliLogger {
14    fn level(&self) -> LogLevel;
15    fn set_level(&mut self, level: LogLevel);
16    fn log(&mut self, level: LogLevel, args: core::fmt::Arguments<'_>);
17}
18
19#[macro_export]
20macro_rules! cli_log {
21    ($logger:expr, $level:expr, $($arg:tt)*) => {{
22        let logger = &mut $logger;
23        if logger.level() >= $level {
24            logger.log($level, core::format_args!($($arg)*));
25        }
26    }};
27}
28
29/// Drops all log records. Useful in tests and on targets that don't want logs.
30pub struct NullLogger {
31    level: LogLevel,
32}
33
34impl NullLogger {
35    pub const fn new() -> Self {
36        NullLogger {
37            level: LogLevel::Info,
38        }
39    }
40}
41
42impl Default for NullLogger {
43    fn default() -> Self {
44        Self::new()
45    }
46}
47
48impl CliLogger for NullLogger {
49    fn level(&self) -> LogLevel {
50        self.level
51    }
52    fn set_level(&mut self, level: LogLevel) {
53        self.level = level;
54    }
55    fn log(&mut self, _level: LogLevel, _args: core::fmt::Arguments<'_>) {}
56}