studiole_logging/construction/
logger.rs1use crate::prelude::*;
3use std::sync::OnceLock;
4use tracing_subscriber::filter::LevelFilter;
5use tracing_subscriber::filter::Targets;
6
7static INIT: OnceLock<()> = OnceLock::new();
12
13#[derive(Debug)]
15pub struct Logger {
16 pub(crate) level: LogLevel,
18 pub(crate) targets: Vec<TargetFilter>,
20 #[cfg(not(target_arch = "wasm32"))]
26 pub(crate) writer: Option<SharedWriter>,
27}
28
29impl Init for Logger {
30 fn init(&self, _services: &ServiceProvider) -> Result<(), Report<InitError>> {
31 let mut output: Result<(), Report<InitError>> = Ok(());
32 INIT.get_or_init(|| {
33 output = self.set();
34 });
35 output
36 }
37}
38
39impl Logger {
40 pub(super) fn build_targets(&self) -> Targets {
42 let mut targets = Targets::new().with_default(LevelFilter::from(self.level));
43 for filter in &self.targets {
44 targets = targets.with_target(&filter.name, LevelFilter::from(filter.level));
45 }
46 targets
47 }
48}