#[cfg(feature = "std")]
use log::LevelFilter;
#[cfg(feature = "std")]
use std::sync::OnceLock;
#[cfg(feature = "std")]
static LOGGER_INITIALIZED: OnceLock<()> = OnceLock::new();
#[cfg(feature = "std")]
pub fn init_logger() {
env_logger::init();
let _ = LOGGER_INITIALIZED.set(());
}
#[cfg(feature = "std")]
pub fn init_logger_with_filter(filter: &str) {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(filter)).init();
let _ = LOGGER_INITIALIZED.set(());
}
#[cfg(feature = "std")]
pub fn try_init_logger() -> Result<(), &'static str> {
LOGGER_INITIALIZED
.set(())
.map_err(|_| "Logger already initialized")?;
env_logger::try_init().map_err(|_| "Logger already initialized")
}
#[cfg(feature = "std")]
pub fn try_init_logger_with_filter(filter: &str) -> Result<(), &'static str> {
LOGGER_INITIALIZED
.set(())
.map_err(|_| "Logger already initialized")?;
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(filter))
.try_init()
.map_err(|_| "Logger already initialized")
}
#[cfg(feature = "std")]
pub fn is_logger_initialized() -> bool {
LOGGER_INITIALIZED.get().is_some()
}
#[cfg(feature = "std")]
pub fn get_log_level() -> Option<LevelFilter> {
if is_logger_initialized() {
Some(LevelFilter::Info)
} else {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_try_init_logger() {
let result = try_init_logger();
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_try_init_logger_with_filter() {
if !is_logger_initialized() {
let result = try_init_logger_with_filter("debug");
assert!(result.is_ok() || result.is_err());
}
}
#[test]
fn test_is_logger_initialized() {
let _ = is_logger_initialized();
}
}