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, PartialEq)]
pub enum WriterConfig {
None,
Display(
DisplayPreference,
),
File(String ),
DisplayAndFile(
DisplayPreference,
String,
),
}
#[derive(Clone)]
pub enum DisplayPreference {
Stdout,
Stderr,
SharedWriter(SharedWriter),
}
impl PartialEq for DisplayPreference {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(DisplayPreference::Stdout, DisplayPreference::Stdout)
| (DisplayPreference::Stderr, DisplayPreference::Stderr) => true,
(
DisplayPreference::SharedWriter(sw_lhs),
DisplayPreference::SharedWriter(sw_rhs),
) => sw_lhs == sw_rhs,
_ => false,
}
}
}
#[cfg(test)]
mod tests_partial_eq_display_preference {
use super::*;
fn make_shared_writer() -> SharedWriter {
let (line_sender, _) = tokio::sync::mpsc::channel(1_000);
SharedWriter::new(line_sender)
}
#[test]
fn test_display_preference_partial_eq_stdout() {
assert_eq!(DisplayPreference::Stdout, DisplayPreference::Stdout);
assert_ne!(DisplayPreference::Stdout, DisplayPreference::Stderr);
assert_ne!(
DisplayPreference::Stdout,
DisplayPreference::SharedWriter(make_shared_writer())
);
}
#[test]
fn test_display_preference_partial_eq_stderr() {
assert_eq!(DisplayPreference::Stderr, DisplayPreference::Stderr);
assert_ne!(DisplayPreference::Stderr, DisplayPreference::Stdout);
assert_ne!(
DisplayPreference::Stderr,
DisplayPreference::SharedWriter(make_shared_writer())
);
}
#[test]
fn test_display_preference_partial_eq_shared_writer() {
let writer_1 = make_shared_writer();
let writer_2 = make_shared_writer();
assert_eq!(
DisplayPreference::SharedWriter(writer_1.clone()),
DisplayPreference::SharedWriter(writer_1.clone())
);
assert_ne!(
DisplayPreference::SharedWriter(writer_1.clone()),
DisplayPreference::SharedWriter(writer_2.clone())
);
assert_ne!(
DisplayPreference::SharedWriter(writer_1.clone()),
DisplayPreference::Stdout
);
assert_ne!(
DisplayPreference::SharedWriter(writer_1.clone()),
DisplayPreference::Stderr
);
}
}
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 get_writer_config(&self) -> WriterConfig { self.writer_config.clone() }
pub fn get_level_filter(&self) -> LevelFilter { self.level_filter }
}