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
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}