1use serde::{Serialize, Deserialize};
5use std::fmt::{Display, Formatter};
6use chrono::{Local, DateTime};
7
8#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord, Hash, Debug, Default,
17 Serialize, Deserialize)]
18pub enum Verbosity {
19 All = 0,
21 #[default]
22 Standard = 1,
24 Quiet = 2,
26 ErrorsOnly = 3,
28}
29
30#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Default,
33 Serialize, Deserialize)]
34pub enum OnDropPolicy {
35 IgnoreLogFileLock,
38 #[default]
39 DiscardLogBuffer,
42}
43
44
45#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Default,
47 Serialize, Deserialize)]
48pub enum LogType {
49 Debug = 0,
51 #[default]
52 Info = 1,
54 Warning = 2,
56 Err = 3,
58 FatalError = 4,
60}
61
62#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Default)]
75pub struct LogStruct {
76 pub message: String,
78 pub log_type: LogType,
80 pub datetime: DateTime<Local>,
82}
83
84impl LogStruct {
85 pub fn debug(message: &str) -> LogStruct {
93 LogStruct {
94 message: message.to_string(),
95 log_type: LogType::Debug,
96 datetime: Local::now(),
97 }
98 }
99
100 pub fn info(message: &str) -> LogStruct {
108 LogStruct {
109 message: message.to_string(),
110 log_type: LogType::Info,
111 datetime: Local::now(),
112 }
113 }
114
115 pub fn warning(message: &str) -> LogStruct {
123 LogStruct {
124 message: message.to_string(),
125 log_type: LogType::Warning,
126 datetime: Local::now(),
127 }
128 }
129
130 pub fn error(message: &str) -> LogStruct {
138 LogStruct {
139 message: message.to_string(),
140 log_type: LogType::Err,
141 datetime: Local::now(),
142 }
143 }
144
145 pub fn fatal_error(message: &str) -> LogStruct {
153 LogStruct {
154 message: message.to_string(),
155 log_type: LogType::FatalError,
156 datetime: Local::now(),
157 }
158 }
159}
160
161impl Display for LogStruct {
162 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
163 return write!(
164 f,
165 "Log: {}\nType: {:?}\nDateTime: {}",
166 self.message,
167 self.log_type,
168 self.datetime
169 )
170 }
171}
172
173
174impl std::fmt::Display for Verbosity {
175 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
176 let level_str = match *self {
177 Verbosity::All => "All",
178 Verbosity::Standard => "Standard",
179 Verbosity::Quiet => "Quiet",
180 Verbosity::ErrorsOnly => "ErrorsOnly",
181 };
182 return write!(f, "{}", level_str)
183 }
184}
185
186impl TryFrom<i32> for Verbosity {
187 type Error = String;
188 fn try_from(value: i32) -> Result<Self, Self::Error> {
189 match value {
190 0 => Ok(Verbosity::All),
191 1 => Ok(Verbosity::Standard),
192 2 => Ok(Verbosity::Quiet),
193 3 => Ok(Verbosity::ErrorsOnly),
194 _ => Err(String::from("Invalid value, please provide a value in range from 0 to 3.")),
195 }
196 }
197}
198
199impl AsRef<str> for Verbosity {
200 fn as_ref(&self) -> &str {
201 match self {
202 Verbosity::All => "All",
203 Verbosity::Standard => "Standard",
204 Verbosity::Quiet => "Quiet",
205 Verbosity::ErrorsOnly => "ErrorsOnly",
206 }
207 }
208}
209
210
211impl Display for OnDropPolicy {
212 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
213 let level_str = match *self {
214 OnDropPolicy::IgnoreLogFileLock => "IgnoreLogFileLock",
215 OnDropPolicy::DiscardLogBuffer => "DiscardLogBuffer",
216 };
217 return write!(f, "{}", level_str)
218 }
219}
220
221
222impl TryFrom<i32> for LogType {
223 type Error = String;
224 fn try_from(value: i32) -> Result<Self, Self::Error> {
225 match value {
226 0 => Ok(LogType::Debug),
227 1 => Ok(LogType::Info),
228 2 => Ok(LogType::Warning),
229 3 => Ok(LogType::Err),
230 4 => Ok(LogType::FatalError),
231 _ => Err(String::from("Invalid value, please provide a value in range from 0 to 4.")),
232 }
233 }
234}
235
236impl Display for LogType {
237 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
238 let level_str = match *self {
239 LogType::Debug => "Debug",
240 LogType::Info => "Info",
241 LogType::Warning => "Warning",
242 LogType::Err => "Error",
243 LogType::FatalError => "FatalError",
244 };
245 return write!(f, "{}", level_str)
246 }
247}
248
249impl AsRef<str> for LogType {
250 fn as_ref(&self) -> &str {
251 match self {
252 LogType::Debug => "Debug",
253 LogType::Info => "Info",
254 LogType::Warning => "Warning",
255 LogType::Err => "Err",
256 LogType::FatalError => "FatalError",
257 }
258 }
259}