use crate::logger::LOGGER_STDOUT_NAME;
use log::LevelFilter;
use serde::Deserialize;
use std::borrow::Cow;
const DEFAULT_COLOR_ENABLED: bool = true;
const DEFAULT_OUTPUT_NAME: &str = LOGGER_STDOUT_NAME;
const DEFAULT_OUTPUT_LEVEL: LevelFilter = LevelFilter::Info;
#[derive(Default, Deserialize)]
pub struct LoggerOutputConfigBuilder {
name: Option<String>,
level: Option<LevelFilter>,
}
impl LoggerOutputConfigBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn name<'a>(mut self, name: impl Into<Cow<'a, str>>) -> Self {
self.name.replace(name.into().into_owned());
self
}
pub fn level(mut self, level: LevelFilter) -> Self {
self.level.replace(level);
self
}
pub fn finish(self) -> LoggerOutputConfig {
LoggerOutputConfig {
name: self.name.unwrap_or_else(|| DEFAULT_OUTPUT_NAME.to_owned()),
level: self.level.unwrap_or(DEFAULT_OUTPUT_LEVEL),
}
}
}
#[derive(Clone)]
pub struct LoggerOutputConfig {
pub(crate) name: String,
pub(crate) level: LevelFilter,
}
#[derive(Default, Deserialize)]
pub struct LoggerConfigBuilder {
color_enabled: Option<bool>,
outputs: Option<Vec<LoggerOutputConfigBuilder>>,
}
impl LoggerConfigBuilder {
pub fn color_enabled(mut self, color: bool) -> Self {
self.color_enabled.replace(color);
self
}
pub fn level<'a>(&mut self, name: impl Into<Cow<'a, str>>, level: LevelFilter) {
let name = name.into();
if let Some(outputs) = self.outputs.as_deref_mut() {
if let Some(stdout) = outputs.iter_mut().find(|output| match output.name.as_ref() {
Some(output_name) => output_name[..] == name,
None => false,
}) {
stdout.level.replace(level);
}
}
}
pub fn finish(self) -> LoggerConfig {
let outputs = self
.outputs
.map(|os| os.into_iter().map(|o| o.finish()).collect())
.unwrap_or_default();
LoggerConfig {
color_enabled: self.color_enabled.unwrap_or(DEFAULT_COLOR_ENABLED),
outputs,
}
}
}
#[derive(Clone)]
pub struct LoggerConfig {
pub(crate) color_enabled: bool,
pub(crate) outputs: Vec<LoggerOutputConfig>,
}
impl LoggerConfig {
pub fn build() -> LoggerConfigBuilder {
LoggerConfigBuilder::default()
}
}