summaryrefslogtreecommitdiffstats
path: root/vendor/tracing-subscriber/tests/layer_filters/per_event.rs
blob: 9c785f9a23d2544b12477970c8b70767857cef87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use crate::support::*;
use tracing::Level;
use tracing_subscriber::{field::Visit, layer::Filter, prelude::*};

struct FilterEvent;

impl<S> Filter<S> for FilterEvent {
    fn enabled(
        &self,
        _meta: &tracing::Metadata<'_>,
        _cx: &tracing_subscriber::layer::Context<'_, S>,
    ) -> bool {
        true
    }

    fn event_enabled(
        &self,
        event: &tracing::Event<'_>,
        _cx: &tracing_subscriber::layer::Context<'_, S>,
    ) -> bool {
        struct ShouldEnable(bool);
        impl Visit for ShouldEnable {
            fn record_bool(&mut self, field: &tracing_core::Field, value: bool) {
                if field.name() == "enable" {
                    self.0 = value;
                }
            }

            fn record_debug(
                &mut self,
                _field: &tracing_core::Field,
                _value: &dyn core::fmt::Debug,
            ) {
            }
        }
        let mut should_enable = ShouldEnable(false);
        event.record(&mut should_enable);
        should_enable.0
    }
}

#[test]
fn per_subscriber_event_field_filtering() {
    let (expect, handle) = layer::mock()
        .event(event::mock().at_level(Level::TRACE))
        .event(event::mock().at_level(Level::INFO))
        .done()
        .run_with_handle();

    let _subscriber = tracing_subscriber::registry()
        .with(expect.with_filter(FilterEvent))
        .set_default();

    tracing::trace!(enable = true, "hello trace");
    tracing::debug!("hello debug");
    tracing::info!(enable = true, "hello info");
    tracing::warn!(enable = false, "hello warn");
    tracing::error!("hello error");

    handle.assert_finished();
}