1#[derive(Clone, Copy, Debug)]
4pub enum BogLevel {
5 NOTE,
7 ERROR,
8 WARN,
9 INFO,
10 _WRN,
12 _NFO,
14 DEBUG,
15 EMPTY,
16 ___,
21
22 CUSTOM(&'static str), }
24
25pub trait BogFmter {
29 fn tag(&self, level: BogLevel, tag: &str) -> String;
30
31 fn format(&self, level: BogLevel, tag: &str, msg: &str) -> String {
32 let mut s = self.tag(level, tag);
33
34 if !msg.is_empty() {
35 s.push(' ');
36 s.push_str(msg);
37 }
38
39 s
40 }
41
42 fn priority(&self, level: &BogLevel) -> u8 {
47 match level {
48 BogLevel::NOTE => 120,
49 BogLevel::ERROR => 100,
50 BogLevel::WARN => 80,
51 BogLevel::INFO => 60,
52 BogLevel::DEBUG => 20,
53 BogLevel::___ => 0, BogLevel::_WRN | BogLevel::_NFO => 40,
57 BogLevel::EMPTY => 120,
58 BogLevel::CUSTOM(_) => 120,
59 }
60 }
61}
62
63pub struct Fg {}
65impl BogFmter for Fg {
66 fn tag(&self, level: BogLevel, tag: &str) -> String {
67 let (code, lvl) = match level {
68 BogLevel::NOTE => ("34", "NOTE"), BogLevel::ERROR => ("31", "ERRO"), BogLevel::WARN | BogLevel::_WRN => ("33", "WARN"), BogLevel::INFO | BogLevel::_NFO => ("32", "INFO"), BogLevel::DEBUG => ("35", "DBUG"), BogLevel::EMPTY => ("30", ""), BogLevel::___ => ("", ""), BogLevel::CUSTOM(s) => ("34", s), };
77 let mut s = format!("\x1b[{code}m[{lvl}");
78 if !tag.is_empty() {
79 s.push_str(": ");
80 s.push_str(tag);
81 } else if matches!(level, BogLevel::EMPTY) {
82 s.push_str(tag);
83 };
84
85 s.push_str("]\x1b[0m");
86 s
87 }
88}
89
90pub struct Bg {}
91impl BogFmter for Bg {
92 fn tag(&self, level: BogLevel, tag: &str) -> String {
93 let (code, lvl) = match level {
94 BogLevel::NOTE => ("44", "NOTE "), BogLevel::ERROR => ("41", "ERROR"), BogLevel::WARN | BogLevel::_WRN => ("43", "WARN "), BogLevel::INFO | BogLevel::_NFO => ("42", "INFO "), BogLevel::DEBUG => ("45", "DEBUG"), BogLevel::EMPTY => ("47", ""), BogLevel::___ => ("", ""), BogLevel::CUSTOM(s) => ("44", s), };
103
104 let mut start = format!("\x1b[30;{code}m{lvl}"); if !tag.is_empty() {
106 start.push_str("| ");
107 start.push_str(tag);
108 } else if matches!(level, BogLevel::EMPTY) {
109 start.push_str(tag);
110 };
111 start.push_str(" \x1b[0m");
112
113 start
114 }
115}