1use tracing_subscriber::{
2 field::VisitOutput,
3 fmt::format::{DefaultVisitor, Writer},
4 layer::SubscriberExt,
5 util::SubscriberInitExt,
6 Layer, Registry,
7};
8
9#[derive(Default)]
10pub struct BaliusLayer {}
11
12impl BaliusLayer {
13 pub fn new() -> Self {
14 Self::default()
15 }
16}
17
18impl<S: tracing::Subscriber> Layer<S> for BaliusLayer {
19 fn on_event(
20 &self,
21 event: &tracing::Event<'_>,
22 _ctx: tracing_subscriber::layer::Context<'_, S>,
23 ) {
24 let context = event.metadata().target();
25 let level = match *event.metadata().level() {
26 tracing::Level::TRACE => crate::wit::balius::app::logging::Level::Trace,
27 tracing::Level::DEBUG => crate::wit::balius::app::logging::Level::Debug,
28 tracing::Level::INFO => crate::wit::balius::app::logging::Level::Info,
29 tracing::Level::WARN => crate::wit::balius::app::logging::Level::Warn,
30 tracing::Level::ERROR => crate::wit::balius::app::logging::Level::Error,
31 };
32
33 let mut message = String::new();
34 let mut visitor = DefaultVisitor::new(Writer::new(&mut message), true);
35 event.record(&mut visitor);
36 if visitor.finish().is_err() {
37 message = "[error formatting message]".to_string();
38 }
39
40 crate::wit::balius::app::logging::log(level, context, &message);
41 }
42}
43
44pub fn init() {
45 Registry::default().with(BaliusLayer::new()).init();
46}