rush_sync_server/output/
logging.rs1use crate::core::prelude::*;
3use log::{Level, Log, Metadata, Record};
4use once_cell::sync::Lazy;
5use std::sync::{Arc, Mutex};
6
7static LOG_MESSAGES: Lazy<Arc<Mutex<Vec<LogMessage>>>> =
8 Lazy::new(|| Arc::new(Mutex::new(Vec::new())));
9
10#[derive(Debug, Clone)]
11pub struct LogMessage {
12 pub level: Option<Level>,
13 pub message: String,
14}
15
16impl LogMessage {
17 pub fn new<L: Into<Option<Level>>, S: Into<String>>(level: L, message: S) -> Self {
18 Self {
19 level: level.into(),
20 message: message.into(),
21 }
22 }
23
24 pub fn formatted(&self) -> String {
26 match self.level {
27 Some(level) => format!("[{}] {}", level.to_string().to_uppercase(), self.message),
28 None => self.message.clone(),
29 }
30 }
31}
32
33pub struct AppLogger;
34
35impl AppLogger {
36 pub fn log(level: Level, message: impl Into<String>) {
37 let mut logs = LOG_MESSAGES.lock().unwrap();
38 logs.push(LogMessage::new(Some(level), message));
39 }
40
41 pub fn log_plain(message: impl Into<String>) {
42 let mut logs = LOG_MESSAGES.lock().unwrap();
43 logs.push(LogMessage::new(None, message));
44 }
45
46 pub fn get_messages() -> Result<Vec<LogMessage>> {
47 let mut logs = LOG_MESSAGES.lock().unwrap();
48 let msgs = logs.clone();
49 logs.clear();
50 Ok(msgs)
51 }
52}
53
54struct GlobalLogger;
56
57impl Log for GlobalLogger {
58 fn enabled(&self, metadata: &Metadata) -> bool {
59 metadata.level() <= Level::Trace
60 }
61
62 fn log(&self, record: &Record) {
63 if self.enabled(record.metadata()) {
64 AppLogger::log(record.level(), record.args().to_string());
65 }
66 }
67
68 fn flush(&self) {}
69}
70
71pub fn init() -> Result<()> {
72 if log::set_boxed_logger(Box::new(GlobalLogger)).is_ok() {
73 log::set_max_level(log::LevelFilter::Trace);
74 }
75 Ok(())
76}
77