1
- use std:: str:: FromStr ;
2
-
3
1
use serde:: de:: { self , Visitor } ;
4
2
use serde:: { Deserialize , Serialize } ;
5
3
use strum:: IntoEnumIterator ;
@@ -48,6 +46,7 @@ impl FromStr for RuleSelector {
48
46
type Err = ParseError ;
49
47
50
48
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
49
+ // **Changes should be reflected in `parse_no_redirect` as well**
51
50
match s {
52
51
"ALL" => Ok ( Self :: All ) ,
53
52
#[ allow( deprecated) ]
@@ -67,7 +66,6 @@ impl FromStr for RuleSelector {
67
66
return Ok ( Self :: Linter ( linter) ) ;
68
67
}
69
68
70
- // Does the selector select a single rule?
71
69
let prefix = RuleCodePrefix :: parse ( & linter, code)
72
70
. map_err ( |_| ParseError :: Unknown ( s. to_string ( ) ) ) ?;
73
71
@@ -302,7 +300,7 @@ mod schema {
302
300
. filter ( |p| {
303
301
// Exclude any prefixes where all of the rules are removed
304
302
if let Ok ( Self :: Rule { prefix, .. } | Self :: Prefix { prefix, .. } ) =
305
- RuleSelector :: from_str ( p)
303
+ RuleSelector :: parse_no_redirect ( p)
306
304
{
307
305
!prefix. rules ( ) . all ( |rule| rule. is_removed ( ) )
308
306
} else {
@@ -341,6 +339,41 @@ impl RuleSelector {
341
339
}
342
340
}
343
341
}
342
+
343
+ /// Parse [`RuleSelector`] from a string; but do not follow redirects.
344
+ pub fn parse_no_redirect ( s : & str ) -> Result < Self , ParseError > {
345
+ // **Changes should be reflected in `from_str` as well**
346
+ match s {
347
+ "ALL" => Ok ( Self :: All ) ,
348
+ #[ allow( deprecated) ]
349
+ "NURSERY" => Ok ( Self :: Nursery ) ,
350
+ "C" => Ok ( Self :: C ) ,
351
+ "T" => Ok ( Self :: T ) ,
352
+ _ => {
353
+ let ( linter, code) =
354
+ Linter :: parse_code ( s) . ok_or_else ( || ParseError :: Unknown ( s. to_string ( ) ) ) ?;
355
+
356
+ if code. is_empty ( ) {
357
+ return Ok ( Self :: Linter ( linter) ) ;
358
+ }
359
+
360
+ let prefix = RuleCodePrefix :: parse ( & linter, code)
361
+ . map_err ( |_| ParseError :: Unknown ( s. to_string ( ) ) ) ?;
362
+
363
+ if is_single_rule_selector ( & prefix) {
364
+ Ok ( Self :: Rule {
365
+ prefix,
366
+ redirected_from : None ,
367
+ } )
368
+ } else {
369
+ Ok ( Self :: Prefix {
370
+ prefix,
371
+ redirected_from : None ,
372
+ } )
373
+ }
374
+ }
375
+ }
376
+ }
344
377
}
345
378
346
379
#[ derive( EnumIter , PartialEq , Eq , PartialOrd , Ord , Copy , Clone , Debug ) ]
0 commit comments