use std::path::{Path, PathBuf};
pub struct Builder {
crate_filters: Vec<(String, log::LevelFilter)>,
mod_filters: Vec<(String, log::LevelFilter)>,
default_level: log::LevelFilter,
log_to_file: bool,
log_filename: Option<PathBuf>,
time_format: String,
}
impl Default for Builder {
fn default() -> Self {
Self::new()
}
}
impl Builder {
#[must_use]
pub fn new() -> Self {
Self {
crate_filters: Vec::new(),
mod_filters: Vec::new(),
default_level: log::LevelFilter::Info,
log_to_file: false,
log_filename: None,
time_format: String::new(),
}
}
#[must_use]
pub fn add_crate_filter(mut self, crate_name: &str, level: log::LevelFilter) -> Self {
self.crate_filters.push((crate_name.to_owned(), level));
self
}
#[must_use]
pub fn add_mod_filter(mut self, crate_name: &str, level: log::LevelFilter) -> Self {
self.mod_filters.push((crate_name.to_owned(), level));
self
}
#[must_use]
pub const fn default_filter(mut self, level: log::LevelFilter) -> Self {
self.default_level = level;
self
}
#[must_use]
pub const fn log_to_file(mut self) -> Self {
self.log_to_file = true;
self
}
#[must_use]
pub fn log_filname(mut self, filename: &Path) -> Self {
self.log_filename = Some(filename.to_owned());
self
}
#[must_use]
pub fn time_format(mut self, format: &str) -> Self {
format.clone_into(&mut self.time_format);
self
}
#[must_use]
pub fn create(self) -> super::Logger {
let mut logger = crate::Logger::new();
logger.set_default_filter(self.default_level);
for (name, level) in self.crate_filters {
logger.add_filter(&name, crate::FilterType::Crate, level);
}
for (name, level) in self.mod_filters {
logger.add_filter(&name, crate::FilterType::Module, level);
}
logger.set_timestamp_format(&self.time_format);
if self.log_to_file {
logger.set_log_to_file();
}
if let Some(f) = self.log_filename {
logger.set_log_file_name(&f).unwrap();
}
logger
}
pub fn init(self) -> Result<(), crate::LoggerError> {
self.create().enable_logger()
}
}