@@ -20,6 +20,47 @@ fn show_version() {
20
20
println ! ( env!( "CARGO_PKG_VERSION" ) ) ;
21
21
}
22
22
23
+ /// If a command-line option matches `find_arg`, then apply the predicate `pred` on its value. If
24
+ /// true, then return it. The parameter is assumed to be either `--arg=value` or `--arg value`.
25
+ #[ allow( clippy:: while_let_on_iterator) ] // https://github.com/rust-lang/rust-clippy/issues/3670
26
+ fn arg_value < ' a > (
27
+ args : impl IntoIterator < Item = & ' a String > ,
28
+ find_arg : & str ,
29
+ pred : impl Fn ( & str ) -> bool ,
30
+ ) -> Option < & ' a str > {
31
+ let mut args = args. into_iter ( ) . map ( String :: as_str) ;
32
+
33
+ while let Some ( arg) = args. next ( ) {
34
+ let arg: Vec < _ > = arg. splitn ( 2 , '=' ) . collect ( ) ;
35
+ if arg. get ( 0 ) != Some ( & find_arg) {
36
+ continue ;
37
+ }
38
+
39
+ let value = arg. get ( 1 ) . cloned ( ) . or_else ( || args. next ( ) ) ;
40
+ if value. as_ref ( ) . map_or ( false , |p| pred ( p) ) {
41
+ return value;
42
+ }
43
+ }
44
+ None
45
+ }
46
+
47
+ #[ test]
48
+ fn test_arg_value ( ) {
49
+ let args: Vec < _ > = [ "--bar=bar" , "--foobar" , "123" , "--foo" ]
50
+ . iter ( )
51
+ . map ( |s| s. to_string ( ) )
52
+ . collect ( ) ;
53
+
54
+ assert_eq ! ( arg_value( None , "--foobar" , |_| true ) , None ) ;
55
+ assert_eq ! ( arg_value( & args, "--bar" , |_| false ) , None ) ;
56
+ assert_eq ! ( arg_value( & args, "--bar" , |_| true ) , Some ( "bar" ) ) ;
57
+ assert_eq ! ( arg_value( & args, "--bar" , |p| p == "bar" ) , Some ( "bar" ) ) ;
58
+ assert_eq ! ( arg_value( & args, "--bar" , |p| p == "foo" ) , None ) ;
59
+ assert_eq ! ( arg_value( & args, "--foobar" , |p| p == "foo" ) , None ) ;
60
+ assert_eq ! ( arg_value( & args, "--foobar" , |p| p == "123" ) , Some ( "123" ) ) ;
61
+ assert_eq ! ( arg_value( & args, "--foo" , |_| true ) , None ) ;
62
+ }
63
+
23
64
pub fn main ( ) {
24
65
rustc_driver:: init_rustc_env_logger ( ) ;
25
66
exit (
@@ -78,7 +119,7 @@ pub fn main() {
78
119
// crate is
79
120
// linted but not built
80
121
let clippy_enabled = env:: var ( "CLIPPY_TESTS" ) . ok ( ) . map_or ( false , |val| val == "true" )
81
- || orig_args. iter ( ) . any ( |s| s == "--emit=dep-info, metadata" ) ;
122
+ || arg_value ( & orig_args, "--emit" , |val| val . split ( ',' ) . any ( |e| e == "metadata" ) ) . is_some ( ) ;
82
123
83
124
if clippy_enabled {
84
125
args. extend_from_slice ( & [ "--cfg" . to_owned ( ) , r#"feature="cargo-clippy""# . to_owned ( ) ] ) ;
0 commit comments