1use log::{Level, Log, Metadata, Record};
2use std::sync::{Arc, Mutex};
3
4pub static EVENT_LOGGER: EventLogger = EventLogger::new();
5
6#[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}