streamdeck_rs/
logging.rs

1use crate::{LogMessagePayload, MessageOut};
2use futures::channel::mpsc;
3use slog::{Drain, Key, OwnedKVList, Record, KV};
4use std::fmt::{self, Write};
5use std::sync::Mutex;
6
7pub struct StreamDeckDrain<G, S, M> {
8    sink: Mutex<mpsc::UnboundedSender<MessageOut<G, S, M>>>,
9}
10
11impl<G, S, M> StreamDeckDrain<G, S, M> {
12    pub fn new(sink: mpsc::UnboundedSender<MessageOut<G, S, M>>) -> Self {
13        Self {
14            sink: Mutex::new(sink),
15        }
16    }
17}
18
19impl<G, S, M> Drain for StreamDeckDrain<G, S, M> {
20    type Ok = ();
21    type Err = mpsc::TrySendError<MessageOut<G, S, M>>;
22
23    fn log(&self, record: &Record, values: &OwnedKVList) -> Result<Self::Ok, Self::Err> {
24        let mut message = format!("{} {}", record.level().as_short_str(), record.msg());
25
26        let mut serializer = Serializer { stack: Vec::new() };
27        record.kv().serialize(record, &mut serializer).unwrap();
28        values.serialize(record, &mut serializer).unwrap();
29
30        let kv_len = serializer.stack.iter().fold(0, |a, b| a + b.len() + 2);
31        message.reserve_exact(kv_len);
32        while let Some(value) = serializer.stack.pop() {
33            write!(message, ", {}", value).unwrap()
34        }
35
36        self.sink
37            .lock()
38            .unwrap()
39            .unbounded_send(MessageOut::LogMessage {
40                payload: LogMessagePayload { message },
41            })
42    }
43}
44
45struct Serializer {
46    stack: Vec<String>,
47}
48
49impl slog::Serializer for Serializer {
50    fn emit_none(&mut self, key: Key) -> slog::Result {
51        self.stack.push(format!("{}: None", key));
52        Ok(())
53    }
54    fn emit_unit(&mut self, key: Key) -> slog::Result {
55        self.stack.push(format!("{}: ()", key));
56        Ok(())
57    }
58    fn emit_bool(&mut self, key: Key, val: bool) -> slog::Result {
59        self.stack.push(format!("{}: {}", key, val));
60        Ok(())
61    }
62    fn emit_char(&mut self, key: Key, val: char) -> slog::Result {
63        self.stack.push(format!("{}: {}", key, val));
64        Ok(())
65    }
66    fn emit_usize(&mut self, key: Key, val: usize) -> slog::Result {
67        self.stack.push(format!("{}: {}", key, val));
68        Ok(())
69    }
70    fn emit_isize(&mut self, key: Key, val: isize) -> slog::Result {
71        self.stack.push(format!("{}: {}", key, val));
72        Ok(())
73    }
74    fn emit_u8(&mut self, key: Key, val: u8) -> slog::Result {
75        self.stack.push(format!("{}: {}", key, val));
76        Ok(())
77    }
78    fn emit_i8(&mut self, key: Key, val: i8) -> slog::Result {
79        self.stack.push(format!("{}: {}", key, val));
80        Ok(())
81    }
82    fn emit_u16(&mut self, key: Key, val: u16) -> slog::Result {
83        self.stack.push(format!("{}: {}", key, val));
84        Ok(())
85    }
86    fn emit_i16(&mut self, key: Key, val: i16) -> slog::Result {
87        self.stack.push(format!("{}: {}", key, val));
88        Ok(())
89    }
90    fn emit_u32(&mut self, key: Key, val: u32) -> slog::Result {
91        self.stack.push(format!("{}: {}", key, val));
92        Ok(())
93    }
94    fn emit_i32(&mut self, key: Key, val: i32) -> slog::Result {
95        self.stack.push(format!("{}: {}", key, val));
96        Ok(())
97    }
98    fn emit_f32(&mut self, key: Key, val: f32) -> slog::Result {
99        self.stack.push(format!("{}: {}", key, val));
100        Ok(())
101    }
102    fn emit_u64(&mut self, key: Key, val: u64) -> slog::Result {
103        self.stack.push(format!("{}: {}", key, val));
104        Ok(())
105    }
106    fn emit_i64(&mut self, key: Key, val: i64) -> slog::Result {
107        self.stack.push(format!("{}: {}", key, val));
108        Ok(())
109    }
110    fn emit_f64(&mut self, key: Key, val: f64) -> slog::Result {
111        self.stack.push(format!("{}: {}", key, val));
112        Ok(())
113    }
114    fn emit_str(&mut self, key: Key, val: &str) -> slog::Result {
115        self.stack.push(format!("{}: {}", key, val));
116        Ok(())
117    }
118    fn emit_arguments(&mut self, key: Key, val: &fmt::Arguments) -> slog::Result {
119        self.stack.push(format!("{}: {}", key, val));
120        Ok(())
121    }
122}