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}