rust_logger/
lib.rs

1mod colors;
2mod log_type;
3mod 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;
15use 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.application_name = env!("CARGO_PKG_NAME").to_string();
29        info.app_version = env!("CARGO_PKG_VERSION").to_string();
30
31        info.time = self.get_time();
32
33        let message = format!(
34            "[{} - {} - (v{}) ({} - {}) - {}]: {}",
35            info.log_type,
36            info.severity,
37            info.app_version,
38            info.application_name,
39            info.type_name,
40            self.format_time(info.time),
41            info.message
42        );
43
44        match info.log_type {
45            LogType::Info => println!("{}{}{}", Colors::ok_blue(), message, Colors::normal()),
46            LogType::Debug => if let Ok(value) = env::var("LOGGER_DEBUG") {
47                if value.to_lowercase() == "true" {
48                    println!("{}{}{}", Colors::ok_green(), message, Colors::normal());
49                }
50            },
51            LogType::Warning => println!("{}{}{}", Colors::warning(), message, Colors::normal()),
52            LogType::Error => println!("{}{}{}", Colors::error(), message, Colors::normal()),
53        }
54    }
55
56    pub fn info<S: AsRef<str>>(&self, message: S) {
57        let message = message.as_ref().to_string();
58
59        let info = Log::new(
60            "".to_string(),
61            Severity::None,
62            LogType::Info,
63            0,
64            message,
65            self.type_name.clone(),
66            "".to_string(),
67        );
68        self.log(info);
69    }
70
71    pub fn debug<S: AsRef<str>>(&self, message: S) {
72        let message = message.as_ref().to_string();
73
74        let info = Log::new(
75            "".to_string(),
76            Severity::None,
77            LogType::Debug,
78            0,
79            message,
80            self.type_name.clone(),
81            "".to_string(),
82        );
83        self.log(info);
84    }
85
86    pub fn warning<S: AsRef<str>>(&self, message: S, severity: Severity) {
87        let message = message.as_ref().to_string();
88
89        let info = Log::new(
90            "".to_string(),
91            severity,
92            LogType::Warning,
93            0,
94            message,
95            self.type_name.clone(),
96            "".to_string(),
97        );
98        self.log(info);
99    }
100
101    pub fn error<S: AsRef<str>>(&self, message: S, severity: Severity) {
102        let message = message.as_ref().to_string();
103
104        let info = Log::new(
105            "".to_string(),
106            severity,
107            LogType::Error,
108            0,
109            message,
110            self.type_name.clone(),
111            "".to_string(),
112        );
113        self.log(info);
114    }
115
116    fn get_time(&self) -> u64 {
117        let start = SystemTime::now();
118
119        let since_the_epoch = start
120            .duration_since(UNIX_EPOCH)
121            .expect("Time went backwards");
122
123        since_the_epoch.as_secs()
124    }
125
126    fn format_time(&self, unix_time: u64) -> String {
127        let utc_datetime = Utc
128            .timestamp_opt(unix_time as i64, 0)
129            .single()
130            .expect("Invalid timestamp");
131
132        let local_datetime = utc_datetime.with_timezone(&Local);
133
134        local_datetime.format("%Y-%m-%d %H:%M:%S").to_string()
135    }
136}