Skip to main content

solverforge_console/
lib.rs

1/* Colorful console output for solver metrics.
2
3Provides a custom `tracing` layer that formats solver events with colors.
4
5## Log Levels
6
7- **INFO**: Lifecycle events (solving/phase start/end)
8- **DEBUG**: Progress updates (1/sec with speed and score)
9- **TRACE**: Individual step evaluations
10*/
11
12mod banner;
13mod format;
14mod layer;
15mod time;
16mod visitor;
17
18pub use layer::SolverConsoleLayer;
19
20use std::sync::OnceLock;
21use tracing_subscriber::layer::SubscriberExt;
22use tracing_subscriber::util::SubscriberInitExt;
23use tracing_subscriber::EnvFilter;
24
25static INIT: OnceLock<()> = OnceLock::new();
26
27/// Initializes the solver console output.
28///
29/// Safe to call multiple times - only the first call has effect.
30/// Prints the SolverForge banner and sets up tracing.
31pub fn init() {
32    INIT.get_or_init(|| {
33        banner::print_banner();
34
35        #[cfg(feature = "verbose-logging")]
36        let solver_level = "solverforge_solver=debug";
37        #[cfg(not(feature = "verbose-logging"))]
38        let solver_level = "solverforge_solver=info";
39
40        let filter = EnvFilter::builder()
41            .with_default_directive(solver_level.parse().unwrap())
42            .from_env_lossy()
43            .add_directive(solver_level.parse().unwrap())
44            .add_directive("solverforge_dynamic=info".parse().unwrap());
45
46        let _ = tracing_subscriber::registry()
47            .with(filter)
48            .with(SolverConsoleLayer)
49            .try_init();
50    });
51}