Skip to main content

solverforge_console/
layer.rs

1// Tracing layer that routes solver events to the console formatter.
2
3use crate::format::format_event;
4use crate::visitor::EventVisitor;
5use std::io::{self, Write};
6use tracing::{Event, Subscriber};
7use tracing_subscriber::layer::Context;
8use tracing_subscriber::Layer;
9
10/// A tracing layer that formats solver events with colors.
11pub struct SolverConsoleLayer;
12
13impl<S: Subscriber> Layer<S> for SolverConsoleLayer {
14    fn on_event(&self, event: &Event<'_>, _ctx: Context<'_, S>) {
15        let metadata = event.metadata();
16        let target = metadata.target();
17
18        // Accept events from solver modules
19        if !target.starts_with("solverforge_solver")
20            && !target.starts_with("solverforge_dynamic")
21            && !target.starts_with("solverforge_py")
22            && !target.starts_with("solverforge::")
23        {
24            return;
25        }
26
27        let mut visitor = EventVisitor::default();
28        event.record(&mut visitor);
29
30        let level = *metadata.level();
31        let output = format_event(&visitor, level);
32        if !output.is_empty() {
33            let _ = writeln!(io::stdout(), "{}", output);
34        }
35    }
36}