Skip to content

Commit 4dd976b

Browse files
authored
Merge pull request #324 from Maximkaaa/try_parse
Add `Builder::try_parse()` method
2 parents 0e25d9e + 05aacb9 commit 4dd976b

File tree

6 files changed

+395
-47
lines changed

6 files changed

+395
-47
lines changed

Cargo.lock

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/env_filter/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
77
<!-- next-header -->
88
## [Unreleased] - ReleaseDate
99

10+
### Features
11+
12+
- Added `env_filter::Builder::try_parse(&self, &str)` method (failable version of `env_filter::Builder::parse()`)
13+
1014
## [0.1.0] - 2024-01-19
1115

1216
<!-- next-url -->

crates/env_filter/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,8 @@ regex = ["dep:regex"]
3333
log = { version = "0.4.8", features = ["std"] }
3434
regex = { version = "1.0.3", optional = true, default-features=false, features=["std", "perf"] }
3535

36+
[dev-dependencies]
37+
snapbox = "0.6"
38+
3639
[lints]
3740
workspace = true

crates/env_filter/src/filter.rs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ use log::{LevelFilter, Metadata, Record};
66

77
use crate::enabled;
88
use crate::parse_spec;
9+
use crate::parser::ParseResult;
910
use crate::Directive;
1011
use crate::FilterOp;
12+
use crate::ParseError;
1113

1214
/// A builder for a log filter.
1315
///
@@ -97,7 +99,17 @@ impl Builder {
9799
///
98100
/// [Enabling Logging]: ../index.html#enabling-logging
99101
pub fn parse(&mut self, filters: &str) -> &mut Self {
100-
let (directives, filter) = parse_spec(filters);
102+
#![allow(clippy::print_stderr)] // compatibility
103+
104+
let ParseResult {
105+
directives,
106+
filter,
107+
errors,
108+
} = parse_spec(filters);
109+
110+
for error in errors {
111+
eprintln!("warning: {error}, ignoring it");
112+
}
101113

102114
self.filter = filter;
103115

@@ -107,6 +119,22 @@ impl Builder {
107119
self
108120
}
109121

122+
/// Parses the directive string, returning an error if the given directive string is invalid.
123+
///
124+
/// See the [Enabling Logging] section for more details.
125+
///
126+
/// [Enabling Logging]: ../index.html#enabling-logging
127+
pub fn try_parse(&mut self, filters: &str) -> Result<&mut Self, ParseError> {
128+
let (directives, filter) = parse_spec(filters).ok()?;
129+
130+
self.filter = filter;
131+
132+
for directive in directives {
133+
self.insert_directive(directive);
134+
}
135+
Ok(self)
136+
}
137+
110138
/// Build a log filter.
111139
pub fn build(&mut self) -> Filter {
112140
assert!(!self.built, "attempt to re-use consumed builder");
@@ -230,6 +258,7 @@ impl fmt::Debug for Filter {
230258
#[cfg(test)]
231259
mod tests {
232260
use log::{Level, LevelFilter};
261+
use snapbox::{assert_data_eq, str};
233262

234263
use super::{enabled, Builder, Directive, Filter};
235264

@@ -444,6 +473,25 @@ mod tests {
444473
}
445474
}
446475

476+
#[test]
477+
fn try_parse_valid_filter() {
478+
let logger = Builder::new()
479+
.try_parse("info,crate1::mod1=warn")
480+
.expect("valid filter returned error")
481+
.build();
482+
assert!(enabled(&logger.directives, Level::Warn, "crate1::mod1"));
483+
assert!(enabled(&logger.directives, Level::Info, "crate2::mod2"));
484+
}
485+
486+
#[test]
487+
fn try_parse_invalid_filter() {
488+
let error = Builder::new().try_parse("info,crate1=invalid").unwrap_err();
489+
assert_data_eq!(
490+
error,
491+
str!["error parsing logger filter: invalid logging spec 'invalid'"]
492+
);
493+
}
494+
447495
#[test]
448496
fn match_full_path() {
449497
let logger = make_logger_filter(vec![

crates/env_filter/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,4 @@ use parser::parse_spec;
5656
pub use filter::Builder;
5757
pub use filter::Filter;
5858
pub use filtered_log::FilteredLog;
59+
pub use parser::ParseError;

0 commit comments

Comments
 (0)