use std::sync::atomic::{AtomicU8, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
const OFF: u8 = 0;
const INFO: u8 = 1;
const DEBUG: u8 = 2;
static LEVEL: AtomicU8 = AtomicU8::new(OFF);
static INIT: AtomicU8 = AtomicU8::new(0);
fn level() -> u8 {
if INIT.load(Ordering::Acquire) == 0 {
let parsed = match std::env::var("BYTEFLOW_LOG") {
Ok(v) => {
let v = v.trim().to_ascii_lowercase();
match v.as_str() {
"" | "0" | "off" | "false" | "no" => OFF,
"debug" | "trace" | "2" => DEBUG,
_ => INFO,
}
}
Err(_) => OFF,
};
LEVEL.store(parsed, Ordering::Release);
INIT.store(1, Ordering::Release);
}
LEVEL.load(Ordering::Acquire)
}
fn stamp_ms() -> u64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_millis() as u64)
.unwrap_or(0)
}
pub fn set_level_for_tests(level: u8) {
LEVEL.store(level.min(DEBUG), Ordering::Release);
INIT.store(1, Ordering::Release);
}
#[inline]
pub fn info(msg: impl std::fmt::Display) {
if level() >= INFO {
eprintln!("[{}] byteflow INFO {}", stamp_ms(), msg);
}
}
#[inline]
pub fn debug(msg: impl std::fmt::Display) {
if level() >= DEBUG {
eprintln!("[{}] byteflow DEBUG {}", stamp_ms(), msg);
}
}