rush_sync_server/output/
logging.rs

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