use crate::logger::loggable::Loggable;
use crate::{LoggerStatus, Message};
use std::any::Any;
use std::sync::Arc;
pub trait LoggerImpl: Send + Sync + Any {
fn status(&self) -> LoggerStatus;
fn log(&self, message: Message);
fn as_any(&self) -> &dyn Any;
}
#[derive(Clone)]
pub struct Logger {
m_impl: Arc<dyn LoggerImpl + Send + Sync>,
}
impl Logger {
pub fn new(implementation: Box<dyn LoggerImpl + Send + Sync>) -> Logger {
Logger {
m_impl: Arc::from(implementation),
}
}
pub fn status(&self) -> LoggerStatus {
self.m_impl.status()
}
pub fn log<T: Loggable>(&self, message: T) -> &Logger {
self.m_impl.log(message.to_message());
self
}
pub fn get_implementation(&self) -> &dyn LoggerImpl {
&*self.m_impl
}
pub fn take_implementation(self) -> Arc<dyn LoggerImpl> {
self.m_impl
}
}