use std::sync::OnceLock;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LogConfig {
#[serde(default)]
pub level: LogLevel,
#[serde(default)]
pub stdio: StdioLogMode,
#[serde(default)]
pub pretty: bool,
#[serde(default = "default_location")]
pub location: bool,
#[serde(default = "default_ansi")]
pub ansi: bool,
#[serde(default)]
pub otlp_endpoint: String,
#[serde(default = "default_opentelemetry_service_name")]
pub opentelemetry_service_name: String,
#[serde(default = "default_opentelemetry_scope_name")]
pub opentelemetry_scope_name: String,
}
fn default_opentelemetry_service_name() -> String {
String::from("Komodo")
}
fn default_opentelemetry_scope_name() -> String {
String::from("Komodo")
}
fn default_location() -> bool {
false
}
fn default_ansi() -> bool {
true
}
impl Default for LogConfig {
fn default() -> Self {
Self {
level: Default::default(),
stdio: Default::default(),
pretty: Default::default(),
location: default_location(),
ansi: default_ansi(),
otlp_endpoint: Default::default(),
opentelemetry_service_name: default_opentelemetry_service_name(
),
opentelemetry_scope_name: default_opentelemetry_scope_name(),
}
}
}
fn default_log_config() -> &'static LogConfig {
static DEFAULT_LOG_CONFIG: OnceLock<LogConfig> = OnceLock::new();
DEFAULT_LOG_CONFIG.get_or_init(Default::default)
}
impl LogConfig {
pub fn is_default(&self) -> bool {
self == default_log_config()
}
}
#[derive(
Debug,
Clone,
Copy,
Default,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
)]
#[serde(rename_all = "lowercase")]
pub enum LogLevel {
Trace,
Debug,
#[default]
Info,
Warn,
Error,
}
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<tracing::Level> for LogLevel {
fn from(value: tracing::Level) -> Self {
match value.as_str() {
"trace" => LogLevel::Trace,
"debug" => LogLevel::Debug,
"info" => LogLevel::Info,
"warn" => LogLevel::Warn,
"error" => LogLevel::Error,
_ => LogLevel::Info,
}
}
}
#[derive(
Debug,
Clone,
Copy,
Default,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
)]
#[serde(rename_all = "lowercase")]
pub enum StdioLogMode {
#[default]
Standard,
Json,
None,
}