1use crate::config::FilterConf;
2use crate::color::Color;
3use log::Level;
4
5#[derive(Copy, Clone)]
6pub enum FilterLevel {
7 Off = 0,
8 Debug = 1,
9 Info = 2,
10 Warn = 4,
11 Error = 8,
12 Trace = 16,
13}
14
15pub struct Filters {
16 filter: u8,
17}
18
19
20#[allow(dead_code)]
21impl Filters {
22 pub fn new(conf: FilterConf) -> Self {
23 let mut filter = 0u8;
25 if conf.debug {
26 filter |= FilterLevel::Debug as u8;
27 }
28 if conf.info {
29 filter |= FilterLevel::Info as u8;
30 }
31
32 if conf.warn {
33 filter |= FilterLevel::Warn as u8;
34 }
35
36 if conf.error {
37 filter |= FilterLevel::Error as u8;
38 }
39
40 if conf.trace {
41 filter |= FilterLevel::Trace as u8;
42 }
43
44 Filters {
45 filter,
46 }
47 }
48
49 pub fn get_filter(&self) -> u8 {
50 self.filter
51 }
52
53 #[allow(dead_code)]
54 pub fn is_pass(&self, level: FilterLevel) -> bool {
55 0 != (self.filter & level as u8)
56 }
57
58 #[allow(dead_code)]
59 pub fn is_enable(&self, level: log::LevelFilter) -> bool {
60 0 != (self.filter & level as u8)
61 }
62}
63
64#[allow(dead_code)]
65impl FilterLevel {
66 pub fn to_str(self) -> &'static str {
67 match self {
68 FilterLevel::Debug => "DEBUG",
69 FilterLevel::Info => "INFO",
70 FilterLevel::Warn => "WARN",
71 FilterLevel::Error => "ERROR",
72 FilterLevel::Trace => "TRACE",
73 FilterLevel::Off => "TRACE",
74 }
75 }
76
77 pub fn fg_color(self) -> Color {
78 match self {
79 FilterLevel::Debug => Color::Cyan,
80 FilterLevel::Info => Color::Green,
81 FilterLevel::Warn => Color::Yellow,
82 FilterLevel::Error => Color::Red,
83 FilterLevel::Trace => Color::White,
84 FilterLevel::Off => Color::White,
85 }
86 }
87
88 pub fn bg_color(self) -> Color {
89 match self {
90 FilterLevel::Debug => Color::Black,
91 FilterLevel::Info => Color::Black,
92 FilterLevel::Warn => Color::Black,
93 FilterLevel::Error => Color::Black,
94 FilterLevel::Trace => Color::Black,
95 FilterLevel::Off => Color::Black,
96 }
97 }
98
99 pub fn from(digit: u8) -> FilterLevel {
100 match digit {
101 0 => FilterLevel::Off,
102 1 => FilterLevel::Debug,
103 2 => FilterLevel::Info,
104 4 => FilterLevel::Warn,
105 8 => FilterLevel::Error,
106 16 => FilterLevel::Trace,
107 _ => unimplemented!(),
108 }
109 }
110}
111
112impl From<log::LevelFilter> for FilterLevel {
113 fn from(level: log::LevelFilter) -> FilterLevel {
114 match level {
115 log::LevelFilter::Debug => FilterLevel::Debug,
116 log::LevelFilter::Info => FilterLevel::Info,
117 log::LevelFilter::Warn => FilterLevel::Warn,
118 log::LevelFilter::Error => FilterLevel::Error,
119 log::LevelFilter::Trace => FilterLevel::Trace,
120 _ => FilterLevel::Off,
121 }
122 }
123}
124impl From<Level> for FilterLevel {
125 fn from(level: Level) -> FilterLevel {
126 match level {
127 Level::Debug => FilterLevel::Debug,
128 Level::Info => FilterLevel::Info,
129 Level::Warn => FilterLevel::Warn,
130 Level::Error => FilterLevel::Error,
131 Level::Trace => FilterLevel::Trace,
132 }
133 }
134}