use crate::service::FvnBuildHasher;
use crate::{logger::Loggable, Logger, LoggerFactory};
use std::collections::HashMap;
pub struct LogManager {
default_logger: Logger,
channel_loggers: HashMap<String, Logger, FvnBuildHasher>,
}
impl LogManager {
pub fn new() -> Self {
LogManager {
default_logger: LoggerFactory::silent(),
channel_loggers: HashMap::default(),
}
}
pub fn new_default(default_logger: Logger) -> Self {
LogManager {
default_logger,
channel_loggers: HashMap::default(),
}
}
pub fn get_logger<Q>(&self, channel: &Q) -> Option<Logger>
where
Q: AsRef<str> + ?Sized,
{
let channel = channel.as_ref();
if channel == "default" {
return Some(self.default_logger.clone());
}
self.channel_loggers.get(channel).cloned() }
pub fn set_logger<S>(&mut self, channel: S, logger: Logger)
where
S: Into<String>,
{
let channel = channel.into();
if channel == "default" {
self.default_logger = logger;
} else {
self.channel_loggers.insert(channel, logger);
}
}
pub fn remove_logger<Q>(&mut self, channel: &Q) -> Option<Logger>
where
Q: AsRef<str> + ?Sized,
{
let channel = channel.as_ref();
if channel != "default" {
return self.channel_loggers.remove(channel);
}
None
}
pub fn get_default_logger(&self) -> Logger {
self.default_logger.clone()
}
pub fn set_default_logger(&mut self, default_logger: Logger) {
self.default_logger = default_logger;
}
pub fn log<T: Loggable>(&self, message: T) -> &Self {
let message = message.to_message();
self.default_logger.log(message);
self
}
pub fn log_channel<Q, L>(&self, channel: &Q, message: L) -> &Self
where
Q: AsRef<str> + ?Sized,
L: Loggable,
{
let message = message.to_message();
if let Some(logger) = self.get_logger(channel) {
logger.log(message);
}
self
}
}