use std::convert::TryFrom;
use tracing_subscriber::reload;
use crate::{
config::Config,
error::{
Error,
Result,
},
};
mod layers;
mod loggers;
mod span_broker;
mod trace_logger;
use layers::Layers;
pub use layers::PolyLayer;
use span_broker::SpanBroker;
pub use trace_logger::TraceLogger;
#[derive(Clone)]
pub struct Handle {
reload_handle: reload::Handle<Layers<SpanBroker>, SpanBroker>,
trace_logger: TraceLogger,
broker: SpanBroker,
}
pub fn init_console_logger() -> Result<Handle> {
let h = Handle::default();
tracing::subscriber::set_global_default(h.subscriber())?;
Ok(h)
}
impl Handle {
#[must_use]
pub fn subscriber(&self) -> TraceLogger {
self.trace_logger.clone()
}
pub fn disable(&self) -> Result<()> {
self.reload_handle
.modify(Layers::disable)
.map_err(Into::into)
}
pub fn enable(&self) -> Result<()> {
self.reload_handle
.modify(Layers::enable)
.map_err(Into::into)
}
pub fn flush(&self) -> Result<()> {
self.reload_handle
.with_current(|ls| ls.appenders().flush())??;
Ok(())
}
pub fn correct_appender_paths(&self) -> Result<()> {
self.reload_handle
.with_current(Layers::correct_appender_paths)??;
Ok(())
}
pub fn update(&mut self, config: &Config) -> Result<()> {
let ls = Layers::from_config(self.broker.clone(), config)?;
Ok(self.reload_handle.reload(ls)?)
}
pub fn from_config(broker: SpanBroker, config: &Config) -> Result<Handle> {
let layers = Layers::from_config(broker.clone(), config)?;
Ok(Self::from_layers(broker, layers))
}
fn from_layers(broker: SpanBroker, layers: Layers) -> Self {
let (reloadable, reload_handle) = reload::Layer::new(layers);
let trace_logger = TraceLogger::new(broker.clone(), reloadable);
Self {
reload_handle,
trace_logger,
broker,
}
}
}
impl Default for Handle {
fn default() -> Self {
let broker = SpanBroker::new();
let layers = Layers::default(broker.clone());
Self::from_layers(broker, layers)
}
}
impl TryFrom<Config> for Handle {
type Error = Error;
fn try_from(c: Config) -> Result<Handle> {
Self::try_from(&c)
}
}
impl TryFrom<&Config> for Handle {
type Error = Error;
fn try_from(c: &Config) -> Result<Handle> {
let broker = SpanBroker::new();
Self::from_config(broker, c)
}
}