@@ -6,8 +6,10 @@ use log::{LevelFilter, Metadata, Record};
66
77use crate :: enabled;
88use crate :: parse_spec;
9+ use crate :: parser:: ParseResult ;
910use crate :: Directive ;
1011use 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) ]
231259mod 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 ! [
0 commit comments