use log::LevelFilter;
use std::sync::atomic::{AtomicBool, Ordering};
static LOGGER_INITIALIZED: AtomicBool = AtomicBool::new(false);
pub fn init_logger() {
env_logger::Builder::from_default_env()
.filter_level(LevelFilter::Info)
.init();
LOGGER_INITIALIZED.store(true, Ordering::SeqCst);
}
pub fn init_logger_with_filter(filter: &str) {
env_logger::Builder::from_default_env()
.filter_level(filter.parse().unwrap_or(LevelFilter::Info))
.init();
LOGGER_INITIALIZED.store(true, Ordering::SeqCst);
}
pub fn try_init_logger() -> Result<(), &'static str> {
env_logger::Builder::from_default_env()
.filter_level(LevelFilter::Info)
.try_init()
.map(|_| {
LOGGER_INITIALIZED.store(true, Ordering::SeqCst);
})
.map_err(|_| "Logger already initialized")
}
pub fn try_init_logger_with_filter(filter: &str) -> Result<(), &'static str> {
env_logger::Builder::from_default_env()
.filter_level(filter.parse().unwrap_or(LevelFilter::Info))
.try_init()
.map(|_| {
LOGGER_INITIALIZED.store(true, Ordering::SeqCst);
})
.map_err(|_| "Logger already initialized")
}
pub fn is_logger_initialized() -> bool {
LOGGER_INITIALIZED.load(Ordering::SeqCst)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_try_init_logger() {
let result = try_init_logger();
if result.is_ok() {
assert!(is_logger_initialized());
}
}
#[test]
fn test_try_init_logger_with_filter() {
let result = try_init_logger_with_filter("debug");
let _ = result;
}
#[test]
fn test_is_logger_initialized() {
let _ = is_logger_initialized();
}
}