use std::str::FromStr;
use serde::Deserialize;
use tracing::metadata::LevelFilter;
#[derive(Debug, Default, Copy, Clone, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum LogLevel {
Trace = 0,
Debug = 1,
#[default]
Info = 2,
Warn = 3,
Error = 4,
}
pub struct UnknownLogLevel;
impl FromStr for LogLevel {
type Err = UnknownLogLevel;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"trace" => Ok(LogLevel::Trace),
"debug" => Ok(LogLevel::Debug),
"info" => Ok(LogLevel::Info),
"warn" => Ok(LogLevel::Warn),
"error" => Ok(LogLevel::Error),
_ => Err(UnknownLogLevel),
}
}
}
impl From<LogLevel> for tracing::Level {
fn from(value: LogLevel) -> Self {
match value {
LogLevel::Trace => tracing::Level::TRACE,
LogLevel::Debug => tracing::Level::DEBUG,
LogLevel::Info => tracing::Level::INFO,
LogLevel::Warn => tracing::Level::WARN,
LogLevel::Error => tracing::Level::ERROR,
}
}
}
impl From<LogLevel> for LevelFilter {
fn from(value: LogLevel) -> Self {
LevelFilter::from_level(value.into())
}
}
pub fn tracing_init(level: impl Into<LevelFilter>) -> tracing_subscriber::fmt::Subscriber {
tracing_subscriber::fmt().with_max_level(level).finish()
}