rust_logger/
lib.rs

1mod colors;
2mod log_type;
3pub mod severity;
4mod log;
5
6use std::{
7    env,
8    time::{SystemTime, UNIX_EPOCH},
9};
10
11use chrono::{Local, TimeZone, Utc};
12use colors::Colors;
13use log::Log;
14use log_type::LogType;
15pub use severity::Severity;
16
17pub struct Logger {
18    type_name: String,
19}
20
21impl Logger {
22    pub fn new<S: AsRef<str>>(type_name: S) -> Self {
23        let type_name = type_name.as_ref().to_string();
24        Self { type_name }
25    }
26
27    fn log(&self, mut info: Log) {
28        info.time = self.get_time();
29
30        let message = format!(
31            "[{} - {} - {} - {}]: {}",
32            info.log_type,
33            info.severity,
34            info.type_name,
35            self.format_time(info.time),
36            info.message
37        );
38
39        match info.log_type {
40            LogType::Info => println!("{}{}{}", Colors::ok_blue(), message, Colors::normal()),
41            LogType::Debug => if let Ok(value) = env::var("DEBUG") {
42                if value.to_lowercase() == "true" {
43                    println!("{}{}{}", Colors::ok_green(), message, Colors::normal());
44                }
45            },
46            LogType::Warning => println!("{}{}{}", Colors::warning(), message, Colors::normal()),
47            LogType::Error => println!("{}{}{}", Colors::error(), message, Colors::normal()),
48        }
49    }
50
51    pub fn info<S: AsRef<str>>(&self, message: S) {
52        let message = message.as_ref().to_string();
53
54        let info = Log::new(
55            Severity::None,
56            LogType::Info,
57            0,
58            message,
59            self.type_name.clone(),
60        );
61        self.log(info);
62    }
63
64    pub fn debug<S: AsRef<str>>(&self, message: S) {
65        let message = message.as_ref().to_string();
66
67        let info = Log::new(
68            Severity::None,
69            LogType::Debug,
70            0,
71            message,
72            self.type_name.clone(),
73        );
74        self.log(info);
75    }
76
77    pub fn warning<S: AsRef<str>>(&self, message: S, severity: Severity) {
78        let message = message.as_ref().to_string();
79
80        let info = Log::new(
81            severity,
82            LogType::Warning,
83            0,
84            message,
85            self.type_name.clone(),
86        );
87        self.log(info);
88    }
89
90    pub fn error<S: AsRef<str>>(&self, message: S, severity: Severity) {
91        let message = message.as_ref().to_string();
92
93        let info = Log::new(
94            severity,
95            LogType::Error,
96            0,
97            message,
98            self.type_name.clone(),
99        );
100        self.log(info);
101    }
102
103    fn get_time(&self) -> u64 {
104        let start = SystemTime::now();
105
106        let since_the_epoch = start
107            .duration_since(UNIX_EPOCH)
108            .expect("Time went backwards");
109
110        since_the_epoch.as_secs()
111    }
112
113    fn format_time(&self, unix_time: u64) -> String {
114        let utc_datetime = Utc
115            .timestamp_opt(unix_time as i64, 0)
116            .single()
117            .expect("Invalid timestamp");
118
119        let local_datetime = utc_datetime.with_timezone(&Local);
120
121        local_datetime.format("%Y-%m-%d %H:%M:%S").to_string()
122    }
123}