Skip to main content

truefix_log/
prefix.rs

1//! Session-ID-prefixing log decorator (`SLF4JLogPrependSessionID` and equivalents, FR-026).
2
3use crate::Log;
4
5/// Wraps any [`Log`] implementation, prepending `[{session_id}] ` to every message/event before
6/// delegating. Generic over the wrapped log so it composes with any sink (screen/file/SQL/
7/// tracing/composite) without each implementation needing its own session-ID-prefix option.
8pub struct SessionPrefixLog<L: Log> {
9    session_id: String,
10    inner: L,
11}
12
13impl<L: Log> SessionPrefixLog<L> {
14    /// Wrap `inner`, prefixing every entry with `session_id`.
15    pub fn new(session_id: impl Into<String>, inner: L) -> Self {
16        Self {
17            session_id: session_id.into(),
18            inner,
19        }
20    }
21}
22
23#[async_trait::async_trait]
24impl<L: Log> Log for SessionPrefixLog<L> {
25    fn on_incoming(&self, message: &str) {
26        self.inner
27            .on_incoming(&format!("[{}] {message}", self.session_id));
28    }
29    fn on_outgoing(&self, message: &str) {
30        self.inner
31            .on_outgoing(&format!("[{}] {message}", self.session_id));
32    }
33    fn on_event(&self, text: &str) {
34        self.inner
35            .on_event(&format!("[{}] {text}", self.session_id));
36    }
37    async fn shutdown(&self) {
38        self.inner.shutdown().await;
39    }
40}