use crate::Message;
use crate::service::ServiceError;
use chrono::{DateTime, SecondsFormat, Utc};
pub trait MessageFormatter: Send + Sync + Default {
fn format_io(
&mut self,
message: &Message,
write: &mut (dyn std::io::Write + Send + Sync),
) -> Result<(), ServiceError>;
fn format_fmt(
&mut self,
message: &Message,
write: &mut (dyn std::fmt::Write + Send + Sync),
) -> Result<(), ServiceError>;
}
#[derive(Default)]
pub struct StandardMessageFormatter {}
impl StandardMessageFormatter {
pub fn new() -> Self {
StandardMessageFormatter {}
}
}
impl MessageFormatter for StandardMessageFormatter {
fn format_io(
&mut self,
message: &Message,
write: &mut (dyn std::io::Write + Send + Sync),
) -> Result<(), ServiceError> {
let instant: DateTime<Utc> = message.instant().into();
write!(
write,
"{} [ {} ] {}\n",
instant.to_rfc3339_opts(SecondsFormat::Nanos, true),
message.level(),
message.content()
)?;
Ok(())
}
fn format_fmt(
&mut self,
message: &Message,
write: &mut (dyn std::fmt::Write + Send + Sync),
) -> Result<(), ServiceError> {
let instant: DateTime<Utc> = message.instant().into();
write!(
write,
"{} [ {} ] {}\n",
instant.to_rfc3339_opts(SecondsFormat::Nanos, true),
message.level(),
message.content()
)?;
Ok(())
}
}
#[derive(Default)]
pub struct AtemporalMessageFormatter {}
impl AtemporalMessageFormatter {
pub fn new() -> Self {
AtemporalMessageFormatter {}
}
}
impl MessageFormatter for AtemporalMessageFormatter {
fn format_io(
&mut self,
message: &Message,
write: &mut (dyn std::io::Write + Send + Sync),
) -> Result<(), ServiceError> {
write!(write, "[ {} ] {}\n", message.level(), message.content())?;
Ok(())
}
fn format_fmt(
&mut self,
message: &Message,
write: &mut (dyn std::fmt::Write + Send + Sync),
) -> Result<(), ServiceError> {
write!(write, "[ {} ] {}\n", message.level(), message.content())?;
Ok(())
}
}