use crate::prelude::*;
use std::sync::OnceLock;
use tracing_subscriber::filter::LevelFilter;
use tracing_subscriber::filter::Targets;
static INIT: OnceLock<()> = OnceLock::new();
#[derive(Debug)]
pub struct Logger {
pub(crate) level: LogLevel,
pub(crate) targets: Vec<TargetFilter>,
#[cfg(not(target_arch = "wasm32"))]
pub(crate) writer: Option<SharedWriter>,
}
impl Init for Logger {
fn init(&self, _services: &ServiceProvider) -> Result<(), Report<InitError>> {
let mut output: Result<(), Report<InitError>> = Ok(());
INIT.get_or_init(|| {
output = self.set();
});
output
}
}
impl Logger {
pub(super) fn build_targets(&self) -> Targets {
let mut targets = Targets::new().with_default(LevelFilter::from(self.level));
for filter in &self.targets {
targets = targets.with_target(&filter.name, LevelFilter::from(filter.level));
}
targets
}
}