Skip to content

Commit 06e6efe

Browse files
committed
max_level_hint for empty cases for Option/Vec Subscribe impls
1 parent 8df4a17 commit 06e6efe

File tree

4 files changed

+59
-2
lines changed

4 files changed

+59
-2
lines changed

tracing-subscriber/src/subscribe/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,7 +1485,10 @@ where
14851485
fn max_level_hint(&self) -> Option<LevelFilter> {
14861486
match self {
14871487
Some(ref inner) => inner.max_level_hint(),
1488-
None => None,
1488+
None => {
1489+
// There is no underlying `Subscribe` so our max level is OFF
1490+
Some(LevelFilter::OFF)
1491+
}
14891492
}
14901493
}
14911494

@@ -1690,7 +1693,8 @@ feature! {
16901693
}
16911694

16921695
fn max_level_hint(&self) -> Option<LevelFilter> {
1693-
let mut max_level = LevelFilter::ERROR;
1696+
// Default to `OFF` if there are no underlying `Subscribe`s
1697+
let mut max_level = LevelFilter::OFF;
16941698
for s in self {
16951699
// NOTE(eliza): this is slightly subtle: if *any* subscriber
16961700
// returns `None`, we have to return `None`, assuming there is

tracing-subscriber/tests/subscriber_filters/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
mod support;
44
use self::support::*;
55
mod filter_scopes;
6+
mod option;
67
mod targets;
78
mod trees;
89
mod vec;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use super::*;
2+
use tracing::Collect;
3+
4+
// This test is just used to compare to the tests below
5+
#[test]
6+
fn just_layer() {
7+
let info = subscriber::named("info")
8+
.run()
9+
.with_filter(LevelFilter::INFO)
10+
.boxed();
11+
12+
let collector = tracing_subscriber::registry().with(info);
13+
assert_eq!(collector.max_level_hint(), Some(LevelFilter::INFO));
14+
}
15+
16+
#[test]
17+
fn layer_and_option_layer() {
18+
let info = subscriber::named("info")
19+
.run()
20+
.with_filter(LevelFilter::INFO)
21+
.boxed();
22+
23+
let debug = subscriber::named("debug")
24+
.run()
25+
.with_filter(LevelFilter::DEBUG)
26+
.boxed();
27+
28+
let mut collector = tracing_subscriber::registry().with(info).with(Some(debug));
29+
assert_eq!(collector.max_level_hint(), Some(LevelFilter::DEBUG));
30+
31+
let error = subscriber::named("error")
32+
.run()
33+
.with_filter(LevelFilter::ERROR)
34+
.boxed();
35+
// None means the other layer takes control
36+
collector = tracing_subscriber::registry().with(error).with(None);
37+
assert_eq!(collector.max_level_hint(), Some(LevelFilter::ERROR));
38+
}
39+
40+
#[test]
41+
fn just_option_layer() {
42+
// Just a None means everything is off
43+
let collector = tracing_subscriber::registry().with(None::<ExpectSubscriber>);
44+
assert_eq!(collector.max_level_hint(), Some(LevelFilter::OFF));
45+
}

tracing-subscriber/tests/subscriber_filters/vec.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,10 @@ fn all_filtered_max_level_hint() {
115115

116116
assert_eq!(collector.max_level_hint(), Some(LevelFilter::DEBUG));
117117
}
118+
119+
#[test]
120+
fn empty_vec() {
121+
// Just a None means everything is off
122+
let collector = tracing_subscriber::registry().with(Vec::<ExpectSubscriber>::new());
123+
assert_eq!(collector.max_level_hint(), Some(LevelFilter::OFF));
124+
}

0 commit comments

Comments
 (0)