rush_sync_server/output/
logging.rs

1// ## BEGIN ##
2use 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    /// ✅ Statt ANSI → Marker (für dein parse_message_parts)
25    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
54/// ✅ Globaler Logger hookt alle log::* calls
55struct 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// ## END ##