#![allow(dead_code)]
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum LogLevel {
Quiet,
#[default]
Normal,
Verbose,
Debug,
Trace,
}
impl LogLevel {
pub fn as_filter_string(self) -> &'static str {
match self {
LogLevel::Quiet => "error",
LogLevel::Normal => "info",
LogLevel::Verbose => "warn,jarvy=info",
LogLevel::Debug => "debug",
LogLevel::Trace => "trace",
}
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum LogFormat {
#[default]
Text,
Json,
}
#[derive(Debug, Clone, Default)]
pub struct LogConfig {
pub level: LogLevel,
pub format: LogFormat,
pub filter: Option<String>,
pub file: Option<String>,
pub disable_file_logging: bool,
}
pub fn default_log_directory() -> PathBuf {
crate::paths::logs_dir().unwrap_or_else(|_| PathBuf::from(".jarvy/logs"))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_log_level_to_filter() {
assert_eq!(LogLevel::Quiet.as_filter_string(), "error");
assert_eq!(LogLevel::Normal.as_filter_string(), "info");
assert_eq!(LogLevel::Debug.as_filter_string(), "debug");
assert_eq!(LogLevel::Trace.as_filter_string(), "trace");
}
#[test]
fn test_log_config_default() {
let config = LogConfig::default();
assert_eq!(config.level, LogLevel::Normal);
assert_eq!(config.format, LogFormat::Text);
assert!(config.filter.is_none());
assert!(config.file.is_none());
assert!(!config.disable_file_logging);
}
#[test]
fn test_default_log_directory() {
let dir = default_log_directory();
assert!(dir.ends_with(".jarvy/logs"));
}
}