use super::{
line::SyslogLineHeader, severity::default_mapping, syslog_default_format,
LevelToSyslogSeverity, SyslogConnection, SyslogFacility, SyslogWriter,
};
use crate::FormatFunction;
use std::io::{Error as IoError, Result as IoResult};
#[allow(clippy::module_name_repetitions)]
pub struct SyslogWriterBuilder {
syslog_connection: SyslogConnection,
syslog_line_header: SyslogLineHeader,
syslog_facility: SyslogFacility,
custom_process_name: Option<String>,
determine_severity: LevelToSyslogSeverity,
max_log_level: log::LevelFilter,
format: FormatFunction,
}
impl SyslogWriterBuilder {
#[must_use]
pub(super) fn new(
syslog: SyslogConnection,
syslog_line_header: SyslogLineHeader,
syslog_facility: SyslogFacility,
) -> SyslogWriterBuilder {
SyslogWriterBuilder {
syslog_connection: syslog,
syslog_line_header,
syslog_facility,
custom_process_name: None,
determine_severity: default_mapping,
max_log_level: log::LevelFilter::Warn,
format: syslog_default_format,
}
}
#[must_use]
pub fn custom_process_name(mut self, name: Option<&str>) -> Self {
self.custom_process_name = name.map(Into::into);
self
}
#[must_use]
pub fn determine_severity(mut self, mapping: LevelToSyslogSeverity) -> Self {
self.determine_severity = mapping;
self
}
#[must_use]
pub fn max_log_level(mut self, max_log_level: log::LevelFilter) -> Self {
self.max_log_level = max_log_level;
self
}
#[must_use]
pub fn format(mut self, format: FormatFunction) -> Self {
self.format = format;
self
}
pub fn build(self) -> IoResult<Box<SyslogWriter>> {
Ok(Box::new(SyslogWriter::new(
std::process::id(),
self.custom_process_name
.or(std::env::args().next())
.ok_or_else(|| {
IoError::other(
"Can't provide a process name as no env args are present and \
no custom process name is set"
.to_owned(),
)
})?,
self.syslog_line_header,
self.syslog_facility,
self.determine_severity,
self.syslog_connection,
self.max_log_level,
self.format,
)?))
}
}