1#[derive(Clone, Copy)]
3pub enum LoggingLevel {
4 Console,
6 None,
8}
9
10pub(crate) static LOGGING_LEVEL: RwLock<LoggingLevel> = RwLock::new(LoggingLevel::None);
11static STARTUP_TIME: RwLock<MaybeUninit<Instant>> = RwLock::new(MaybeUninit::uninit());
12
13#[inline]
15pub fn set_internal_logging_level(logging_level: LoggingLevel) {
16 *LOGGING_LEVEL.write().unwrap() = logging_level
17}
18
19#[inline]
20pub(crate) fn get_logging_level() -> LoggingLevel {
21 *LOGGING_LEVEL.read().unwrap()
22}
23
24#[inline]
25pub(crate) fn get_startup_time() -> Instant {
26 unsafe { (*STARTUP_TIME.read().unwrap()).assume_init_read() }
27}
28
29#[inline]
30pub(crate) fn setup_startup_time() {
31 *STARTUP_TIME.write().unwrap() = MaybeUninit::new(Instant::now())
32}
33
34macro_rules! log {
35 ($($arg:tt)*) => {{
36 use crate::debug::{get_logging_level, get_startup_time, LoggingLevel};
37 let message = format!($($arg)*);
38 let now = get_startup_time().elapsed();
39 match get_logging_level() {
40 LoggingLevel::Console => println!("[{:>13.6}] [LOG] {}", now.as_secs_f32(), message),
41 _ => ()
42 }
43 }};
44}
45
46macro_rules! error {
47 ($($arg:tt)*) => {{
48 use crate::debug::{get_logging_level, get_startup_time, LoggingLevel};
49 let message = format!($($arg)*);
50 let now = get_startup_time().elapsed();
51 match get_logging_level() {
52 LoggingLevel::Console => println!("[{:>13.6}] [ERROR] {}", now.as_secs_f32(), message),
53 _ => ()
54 }
55 }};
56}
57
58macro_rules! fmt_size {
59 ($size:expr) => {
60 if $size >= 1024 * 1024 * 1024 {
61 format!("{:.2}GB", $size as f32 / 1024. / 1024.)
62 } else if $size >= 1024 * 1024 {
63 format!("{:.2}MB", $size as f32 / 1024. / 1024.)
64 } else if $size >= 1024 {
65 format!("{:.2}KB", $size as f32 / 1024.)
66 } else {
67 format!("{}B", $size as u16)
68 }
69 };
70}
71
72use std::{mem::MaybeUninit, sync::RwLock, time::Instant};
73
74pub(crate) use error;
75pub(crate) use fmt_size;
76pub(crate) use log;