use ayun_config::config::default;
use serde::{Deserialize, Serialize};
use serde_variant::to_variant_name;
#[derive(Debug, Deserialize, Serialize)]
pub struct Logger {
#[serde(default)]
pub env_filter: Option<String>,
#[serde(default)]
pub level: Level,
#[serde(default)]
pub format: Format,
#[serde(default = "default_with_ansi")]
pub with_ansi: bool,
#[serde(default)]
pub with_target: bool,
#[serde(default)]
pub with_file: bool,
#[serde(default)]
pub with_line_number: bool,
#[serde(default = "default_with_level")]
pub with_level: bool,
#[serde(default)]
pub with_thread_ids: bool,
#[serde(default)]
pub with_thread_names: bool,
}
impl Default for Logger {
fn default() -> Self {
default::<Self>().expect("Failed to get default value")
}
}
fn default_with_ansi() -> bool {
true
}
fn default_with_level() -> bool {
true
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub enum Level {
#[serde(rename = "trace")]
Trace,
#[serde(rename = "debug")]
Debug,
#[serde(rename = "info")]
#[default]
Info,
#[serde(rename = "warn")]
Warn,
#[serde(rename = "error")]
Error,
}
impl From<Level> for tracing::Level {
fn from(level: Level) -> Self {
match level {
Level::Trace => tracing::Level::TRACE,
Level::Debug => tracing::Level::DEBUG,
Level::Info => tracing::Level::INFO,
Level::Warn => tracing::Level::WARN,
Level::Error => tracing::Level::ERROR,
}
}
}
impl std::fmt::Display for Level {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
to_variant_name(self).expect("only enum supported").fmt(f)
}
}
#[derive(Debug, Default, Deserialize, Serialize)]
pub enum Format {
#[serde(rename = "compact")]
#[default]
Compact,
#[serde(rename = "pretty")]
Pretty,
#[serde(rename = "json")]
Json,
}
impl std::fmt::Display for Format {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
to_variant_name(self).expect("only enum supported").fmt(f)
}
}