use std::fmt;
use std::marker::PhantomData;
use tracing_core::Field;
use tracing_core::Subscriber;
use tracing_subscriber::field::MakeVisitor;
use tracing_subscriber::field::VisitFmt;
use tracing_subscriber::field::VisitOutput;
use tracing_subscriber::fmt::format::Writer;
use tracing_subscriber::layer::Filter;
use crate::util::FilteredFormatFields;
pub struct IndicatifFilter<S> {
show_progress_bars_by_default: bool,
subscriber: PhantomData<S>,
}
impl<S: Subscriber> IndicatifFilter<S> {
pub fn new(show_progress_bars_by_default: bool) -> Self {
Self {
show_progress_bars_by_default,
subscriber: PhantomData,
}
}
}
impl<S: Subscriber> Filter<S> for IndicatifFilter<S> {
fn enabled(
&self,
meta: &tracing::Metadata<'_>,
_: &tracing_subscriber::layer::Context<'_, S>,
) -> bool {
if !meta.is_span() {
return false;
}
if meta.fields().field("indicatif.pb_show").is_some() {
return true;
}
if meta.fields().field("indicatif.pb_hide").is_some() {
return false;
}
self.show_progress_bars_by_default
}
}
pub fn hide_indicatif_span_fields<'writer, Format>(
format: Format,
) -> FilteredFormatFields<Format, impl Fn(&Field) -> bool + Clone>
where
Format: MakeVisitor<Writer<'writer>>,
Format::Visitor: VisitFmt + VisitOutput<fmt::Result>,
{
FilteredFormatFields::new(format, |field: &Field| {
field.name() != "indicatif.pb_show" && field.name() != "indicatif.pb_hide"
})
}