use crate::formatter::OutputFormat;
use crate::level::LogLevel;
use crate::rotator::RotatorConfig;
use crate::color::LogColorScheme;
use crate::filter::LogFilter;
#[derive(Debug, Clone)]
pub struct Config {
pub log_dir: String,
pub file_prefix: String,
pub file_extension: String,
pub console_enabled: bool,
pub level: LogLevel,
pub output_format: OutputFormat,
pub rotation: Option<RotatorConfig>,
pub console_colors: bool,
pub color_scheme: LogColorScheme,
pub filter: LogFilter,
}
impl Default for Config {
fn default() -> Self {
Self {
log_dir: "logs".to_string(),
file_prefix: "serial_".to_string(),
file_extension: ".log".to_string(),
console_enabled: true,
level: LogLevel::Debug,
output_format: OutputFormat::Text,
rotation: Some(RotatorConfig::default()),
console_colors: true,
color_scheme: LogColorScheme::default(),
filter: LogFilter::default(),
}
}
}
impl Config {
pub fn builder() -> ConfigBuilder {
ConfigBuilder::new()
}
pub fn get_log_file_path(&self) -> String {
format!(
"{}/{}{}{}",
self.log_dir,
self.file_prefix,
crate::formatter::Formatter::get_date_string(),
self.file_extension
)
}
}
pub struct ConfigBuilder {
log_dir: Option<String>,
file_prefix: Option<String>,
file_extension: Option<String>,
console_enabled: Option<bool>,
level: Option<LogLevel>,
output_format: Option<OutputFormat>,
rotation: Option<Option<RotatorConfig>>,
console_colors: Option<bool>,
color_scheme: Option<LogColorScheme>,
filter: Option<LogFilter>,
}
impl ConfigBuilder {
pub fn new() -> Self {
ConfigBuilder {
log_dir: None,
file_prefix: None,
file_extension: None,
console_enabled: None,
level: None,
output_format: None,
rotation: None,
console_colors: None,
color_scheme: None,
filter: None,
}
}
pub fn log_dir(mut self, dir: &str) -> Self {
self.log_dir = Some(dir.to_string());
self
}
pub fn file_prefix(mut self, prefix: &str) -> Self {
self.file_prefix = Some(prefix.to_string());
self
}
pub fn file_extension(mut self, ext: &str) -> Self {
self.file_extension = Some(ext.to_string());
self
}
pub fn console_enabled(mut self, enabled: bool) -> Self {
self.console_enabled = Some(enabled);
self
}
pub fn level(mut self, level: LogLevel) -> Self {
self.level = Some(level);
self
}
pub fn output_format(mut self, format: OutputFormat) -> Self {
self.output_format = Some(format);
self
}
pub fn enable_rotation(mut self) -> Self {
self.rotation = Some(Some(RotatorConfig::default()));
self
}
pub fn rotation(mut self, config: RotatorConfig) -> Self {
self.rotation = Some(Some(config));
self
}
pub fn disable_rotation(mut self) -> Self {
self.rotation = Some(None);
self
}
pub fn console_colors(mut self, enabled: bool) -> Self {
self.console_colors = Some(enabled);
self
}
pub fn color_scheme(mut self, scheme: LogColorScheme) -> Self {
self.color_scheme = Some(scheme);
self
}
pub fn filter(mut self, filter: LogFilter) -> Self {
self.filter = Some(filter);
self
}
pub fn build(self) -> Config {
Config {
log_dir: self.log_dir.unwrap_or_else(|| "logs".to_string()),
file_prefix: self.file_prefix.unwrap_or_else(|| "serial_".to_string()),
file_extension: self.file_extension.unwrap_or_else(|| ".log".to_string()),
console_enabled: self.console_enabled.unwrap_or(true),
level: self.level.unwrap_or(LogLevel::Debug),
output_format: self.output_format.unwrap_or(OutputFormat::Text),
rotation: self.rotation
.unwrap_or_else(|| Some(RotatorConfig::default())),
console_colors: self.console_colors.unwrap_or(true),
color_scheme: self.color_scheme.unwrap_or_default(),
filter: self.filter.unwrap_or_default(),
}
}
}