projectable/
logger.rs

1use log::{Level, Log, Metadata, Record};
2use std::sync::{Arc, Mutex};
3
4pub static EVENT_LOGGER: EventLogger = EventLogger::new();
5
6/// Simple logger that pushes logs to a set of subscribers
7#[derive(Default)]
8pub struct EventLogger {
9    subscribers: Mutex<Vec<Arc<dyn EventLoggerSubscriber>>>,
10}
11
12impl EventLogger {
13    pub const fn new() -> Self {
14        Self {
15            subscribers: Mutex::new(Vec::new()),
16        }
17    }
18
19    pub fn subscribe(&self, subscriber: Arc<dyn EventLoggerSubscriber>) {
20        self.subscribers.lock().unwrap().push(subscriber);
21    }
22}
23
24impl Log for EventLogger {
25    fn enabled(&self, _metadata: &Metadata) -> bool {
26        true
27    }
28
29    fn log(&self, record: &Record) {
30        let s = record.args().to_string();
31        for subscriber in self.subscribers.lock().unwrap().iter() {
32            subscriber.receive(&s, record.level());
33        }
34    }
35
36    fn flush(&self) {}
37}
38
39pub trait EventLoggerSubscriber: Send + Sync {
40    fn receive(&self, message: &str, level: Level);
41}