1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#[derive(Debug, Clone, Copy)]
pub enum LogLevel {
    Info,
    Warn,
    Error,
}

/// Log level [`Info`, `Warn`, `Error`]
pub const LOG_LEVEL: LogLevel = LogLevel::Info;

impl LogLevel {
    fn as_num(&self) -> u8 {
        use LogLevel::*;
        match &self {
            Info => 0,
            Warn => 1,
            Error => 2,
        }
    }
}

#[derive(Clone)]
pub struct Log<'a> {
    level: &'a LogLevel,
}

impl<'a> Log<'a> {
    pub fn new(level: &LogLevel) -> Log {
        Log { level }
    }

    pub fn println<T, K>(&self, level: LogLevel, tag: &str, msg: K, arg: T)
    where
        T: std::fmt::Debug,
        K: std::fmt::Display,
    {
        if self.level.as_num() <= level.as_num() {
            println!("[ {:?} ] <{}> {}: {:?}", level, tag, msg, arg);
        }
    }
}