use std::fmt::Debug;
use tracing::dispatcher;
use tracing_core::LevelFilter;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
use super::try_create_layers;
use crate::SharedWriter;
#[derive(Debug, Clone)]
pub enum WriterConfig {
None,
Display(
DisplayPreference,
),
File(String ),
DisplayAndFile(
DisplayPreference,
String,
),
}
#[derive(Clone)]
pub enum DisplayPreference {
Stdout,
Stderr,
SharedWriter(SharedWriter),
}
impl Debug for DisplayPreference {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DisplayPreference::Stdout => write!(f, "Stdout"),
DisplayPreference::Stderr => write!(f, "Stderr"),
DisplayPreference::SharedWriter(_) => write!(f, "SharedWriter"),
}
}
}
#[derive(Debug)]
pub struct TracingConfig {
pub writer_config: WriterConfig,
pub level_filter: LevelFilter,
}
impl TracingConfig {
pub fn install_thread_local(self) -> miette::Result<dispatcher::DefaultGuard> {
try_create_layers(self)
.map(|layers| tracing_subscriber::registry().with(layers).set_default())
}
pub fn install_global(self) -> miette::Result<()> {
try_create_layers(self)
.map(|layers| tracing_subscriber::registry().with(layers).init())
}
}
impl TracingConfig {
pub fn new_file_and_display(
filename: Option<String>,
preferred_display: DisplayPreference,
) -> Self {
Self {
writer_config: WriterConfig::DisplayAndFile(
preferred_display,
filename.unwrap_or_else(|| "tracing_log_file_debug.log".to_string()),
),
level_filter: LevelFilter::from_level(tracing::Level::DEBUG),
}
}
pub fn new_display(preferred_display: DisplayPreference) -> Self {
Self {
writer_config: WriterConfig::Display(preferred_display),
level_filter: LevelFilter::from_level(tracing::Level::DEBUG),
}
}
pub fn new_file(filename: Option<String>) -> Self {
Self {
writer_config: WriterConfig::File(
filename.unwrap_or_else(|| "tracing_log_file_debug.log".to_string()),
),
level_filter: LevelFilter::from_level(tracing::Level::DEBUG),
}
}
pub fn get_writer_config(&self) -> WriterConfig { self.writer_config.clone() }
pub fn get_level_filter(&self) -> LevelFilter { self.level_filter }
}