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