use serde::{Deserialize, Serialize};
use std::io::IsTerminal;
use crate::logger::object::{LoggerFormat, LoggerLevel, LoggerTimeZone};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct LoggerConfig {
pub format: LoggerFormat,
pub level: LoggerLevel,
pub tz: LoggerTimeZone,
pub with_targets: bool,
pub use_color: bool,
}
impl Default for LoggerConfig {
fn default() -> Self {
Self {
format: LoggerFormat::default(),
level: LoggerLevel::default(),
tz: LoggerTimeZone::default(),
with_targets: true,
use_color: true,
}
}
}
impl LoggerConfig {
pub fn should_use_color(&self) -> bool {
self.use_color && std::io::stdout().is_terminal()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_values() {
let config = LoggerConfig::default();
assert_eq!(config.format, LoggerFormat::Text);
assert_eq!(config.tz, LoggerTimeZone::Utc);
assert_eq!(config.level.as_str(), "info");
assert_eq!(config.with_targets, true);
assert_eq!(config.use_color, true);
}
#[test]
fn serde_roundtrip() {
let config = LoggerConfig {
format: LoggerFormat::Json,
tz: LoggerTimeZone::Local,
level: "debug".parse().unwrap(),
with_targets: false,
use_color: false,
};
let json = serde_json::to_string(&config).unwrap();
let parsed: LoggerConfig = serde_json::from_str(&json).unwrap();
assert_eq!(config.level.as_str(), parsed.level.as_str());
assert_eq!(config.with_targets, parsed.with_targets);
assert_eq!(config.use_color, parsed.use_color);
assert_eq!(config.format, parsed.format);
assert_eq!(config.tz, parsed.tz);
}
#[test]
fn serde_uses_defaults_for_missing_fields() {
let json = r#"{}"#;
let config: LoggerConfig = serde_json::from_str(json).unwrap();
assert_eq!(config.level.as_str(), LoggerLevel::default().as_str());
assert_eq!(config.format, LoggerFormat::default());
assert_eq!(config.tz, LoggerTimeZone::default());
assert_eq!(config.with_targets, true);
assert_eq!(config.use_color, true);
}
#[test]
fn partial_deserialization() {
let json = r#"{"format": "json", "level": "debug"}"#;
let config: LoggerConfig = serde_json::from_str(json).unwrap();
assert_eq!(config.format, LoggerFormat::Json);
assert_eq!(config.level.as_str(), "debug");
assert_eq!(config.with_targets, true);
assert_eq!(config.use_color, true);
}
}