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}