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}