use crate::{LoggerImpl, LoggerStatus, Message, Service};
use std::any::Any;
pub struct Direct {
service: Box<dyn Service + Send + Sync>,
max_retries: usize,
}
impl Direct {
pub fn new(service: Box<dyn Service + Send + Sync>, max_retries: usize) -> Box<Self> {
Box::new(Self {
service,
max_retries,
})
}
pub fn get_service(&self) -> &dyn Service {
self.service.as_ref()
}
pub fn take_service(self) -> Box<dyn Service + Send + Sync> {
self.service
}
}
impl LoggerImpl for Direct {
fn status(&self) -> LoggerStatus {
self.service.status()
}
fn log(&self, message: Message) {
let mut result = self.service.work(&message);
if result.is_ok() {
return;
}
for _ in 0..self.max_retries {
result = self.service.work(&message);
if result.is_ok() {
return;
}
}
self.service.fallback(&result.unwrap_err(), &message);
}
fn as_any(&self) -> &dyn Any {
self
}
}