tracing-filter 0.1.0-alpha.2

experimental next-generation filtering support for tracing
Documentation
use {
    std::{
        sync::{
            atomic::{AtomicU8, Ordering},
            Arc,
        },
        thread,
    },
    tracing_core::{span, Event, Subscriber},
    tracing_subscriber::{layer::Context, Layer},
};

pub fn subscribe() -> MockLayer {
    MockLayer {
        expect_event: Arc::default(),
        expect_span: Arc::default(),
        name: thread::current()
            .name()
            .unwrap_or("MockLayer")
            .to_string()
            .into_boxed_str()
            .into(),
    }
}

#[derive(Debug, Clone)]
pub struct MockLayer {
    expect_event: Arc<AtomicU8>,
    expect_span: Arc<AtomicU8>,
    name: Arc<str>,
}

impl<S: Subscriber> Layer<S> for MockLayer {
    fn on_event(&self, event: &Event<'_>, ctx: Context<'_, S>) {
        let _ = (event, ctx);
        if self.expect_event.fetch_sub(1, Ordering::SeqCst) == 0 {
            panic!("[{}] received unexpected event", self.name);
        }
    }

    fn on_enter(&self, id: &span::Id, ctx: Context<'_, S>) {
        let _ = (id, ctx);
        if self.expect_span.fetch_sub(1, Ordering::SeqCst) == 0 {
            panic!("[{}] received unexpected span", self.name);
        }
    }
}

impl MockLayer {
    pub fn expect_event(&self) {
        if self.expect_event.fetch_add(1, Ordering::SeqCst) != 0 {
            panic!("[{}] did not receive expected event", self.name);
        }
    }

    pub fn expect_no_event(&self) {
        if self.expect_event.load(Ordering::SeqCst) != 0 {
            panic!("[{}] did not receive expected event", self.name);
        }
    }

    pub fn expect_span(&self) {
        if self.expect_span.fetch_add(1, Ordering::SeqCst) != 0 {
            panic!("[{}] did not receive expected span", self.name);
        }
    }

    pub fn expect_no_span(&self) {
        if self.expect_span.load(Ordering::SeqCst) != 0 {
            panic!("[{}] did not receive expected span", self.name);
        }
    }

    pub fn assert_clear(&self) {
        self.expect_no_event();
        self.expect_no_span();
    }
}