Skip to main content

solverforge_console/
init.rs

1use std::sync::OnceLock;
2
3use tracing_subscriber::layer::SubscriberExt;
4use tracing_subscriber::util::SubscriberInitExt;
5use tracing_subscriber::EnvFilter;
6
7use crate::banner;
8use crate::SolverConsoleLayer;
9
10static INIT: OnceLock<()> = OnceLock::new();
11
12/// Initializes the solver console output.
13///
14/// Safe to call multiple times - only the first call has effect.
15/// Prints the SolverForge banner and sets up tracing.
16pub fn init() {
17    INIT.get_or_init(|| {
18        banner::print_banner();
19
20        #[cfg(feature = "verbose-logging")]
21        let solver_level = "solverforge_solver=debug";
22        #[cfg(not(feature = "verbose-logging"))]
23        let solver_level = "solverforge_solver=info";
24
25        let filter = EnvFilter::builder()
26            .with_default_directive(solver_level.parse().unwrap())
27            .from_env_lossy()
28            .add_directive(solver_level.parse().unwrap())
29            .add_directive("solverforge_dynamic=info".parse().unwrap());
30
31        let _ = tracing_subscriber::registry()
32            .with(filter)
33            .with(SolverConsoleLayer)
34            .try_init();
35    });
36}