#[cfg(not(unix))]
use crate::fake_syslog::SyslogNotSupported;
use crate::file::FileLoggerConfig;
use crate::null::NullLoggerConfig;
#[cfg(unix)]
use crate::syslog::SyslogConfig;
use crate::terminal::TerminalLoggerConfig;
use crate::types::Severity;
use crate::{Build, LoggerBuilder, Result};
use serde::{Deserialize, Serialize};
use slog::Logger;
pub trait Config {
type Builder: Build;
fn try_to_builder(&self) -> Result<Self::Builder>;
fn build_logger(&self) -> Result<Logger> {
let builder = track!(self.try_to_builder())?;
let logger = track!(builder.build())?;
Ok(logger)
}
}
#[allow(missing_docs)]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum LoggerConfig {
File(FileLoggerConfig),
Null(NullLoggerConfig),
#[cfg(unix)]
Syslog(SyslogConfig),
#[cfg(not(unix))]
#[doc(hidden)]
Syslog(SyslogNotSupported),
Terminal(TerminalLoggerConfig),
}
impl LoggerConfig {
pub fn set_loglevel(&mut self, level: Severity) {
match *self {
LoggerConfig::File(ref mut c) => c.level = level,
LoggerConfig::Null(_) => {}
#[cfg(unix)]
LoggerConfig::Syslog(ref mut c) => c.level = level,
#[cfg(not(unix))]
LoggerConfig::Syslog(_) => unreachable!(),
LoggerConfig::Terminal(ref mut c) => c.level = level,
}
}
}
impl Config for LoggerConfig {
type Builder = LoggerBuilder;
fn try_to_builder(&self) -> Result<Self::Builder> {
match *self {
LoggerConfig::File(ref c) => track!(c.try_to_builder()).map(LoggerBuilder::File),
LoggerConfig::Null(ref c) => track!(c.try_to_builder()).map(LoggerBuilder::Null),
#[cfg(unix)]
LoggerConfig::Syslog(ref c) => track!(c.try_to_builder()).map(LoggerBuilder::Syslog),
#[cfg(not(unix))]
LoggerConfig::Syslog(_) => unreachable!(),
LoggerConfig::Terminal(ref c) => {
track!(c.try_to_builder()).map(LoggerBuilder::Terminal)
}
}
}
}
impl Default for LoggerConfig {
fn default() -> Self {
LoggerConfig::Terminal(TerminalLoggerConfig::default())
}
}