use anyhow::Result;
use tracing_subscriber::EnvFilter;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Level {
ERROR = 0,
WARN = 1,
INFO = 2,
DEBUG = 3,
TRACE = 4,
}
impl From<u8> for Level {
fn from(v: u8) -> Self {
match v {
0 => Self::ERROR,
1 => Self::WARN,
2 => Self::INFO,
3 => Self::DEBUG,
_ => Self::TRACE,
}
}
}
impl From<Level> for u8 {
fn from(v: Level) -> Self {
v as u8
}
}
impl From<tracing::Level> for Level {
fn from(v: tracing::Level) -> Self {
match v {
tracing::Level::ERROR => Self::ERROR,
tracing::Level::WARN => Self::WARN,
tracing::Level::INFO => Self::INFO,
tracing::Level::DEBUG => Self::DEBUG,
tracing::Level::TRACE => Self::TRACE,
}
}
}
pub fn init_tracing_subscriber(verbosity: impl Into<u8>) -> Result<()> {
let subscriber = tracing_subscriber::fmt()
.with_max_level(match verbosity.into() {
0 => tracing::Level::ERROR,
1 => tracing::Level::WARN,
2 => tracing::Level::INFO,
3 => tracing::Level::DEBUG,
_ => tracing::Level::TRACE,
})
.finish();
tracing::subscriber::set_global_default(subscriber).map_err(|e| anyhow::anyhow!(e))
}
pub fn init_tracing_subscriber_with_env(verbosity: impl Into<u8>) -> Result<()> {
let subscriber = tracing_subscriber::fmt()
.with_max_level(match verbosity.into() {
0 => tracing::Level::ERROR,
1 => tracing::Level::WARN,
2 => tracing::Level::INFO,
3 => tracing::Level::DEBUG,
_ => tracing::Level::TRACE,
})
.with_env_filter(EnvFilter::from_default_env())
.finish();
tracing::subscriber::set_global_default(subscriber).map_err(|e| anyhow::anyhow!(e))
}
pub fn init_default_tracing() -> Result<()> {
let rust_log = std::env::var("RUST_LOG");
let v = rust_log.map_or(0, |v| v.parse::<u8>().unwrap_or(0));
init_tracing_subscriber_with_env(v)
}