@@ -6,13 +6,15 @@ use criterion::{
66 profiler:: Profiler ,
77 PlottingBackend ,
88} ;
9+ use regex:: Regex ;
910
10- use crate :: { Bencher , BenchmarkGroup , BenchmarkId } ;
11+ use crate :: { Bencher , BenchmarkFilter , BenchmarkGroup , BenchmarkId } ;
1112
1213pub struct Criterion < M : Measurement = WallTime > {
1314 pub codspeed : Option < Rc < RefCell < CodSpeed > > > ,
1415 pub current_file : String ,
1516 pub macro_group : String ,
17+ pub filter : BenchmarkFilter ,
1618 phantom : PhantomData < * const M > ,
1719}
1820
@@ -23,19 +25,57 @@ impl Criterion {
2325 "Harness: codspeed-criterion-compat v{}" ,
2426 env!( "CARGO_PKG_VERSION" ) ,
2527 ) ;
28+
29+ // Parse CLI arguments to extract filter
30+ let filter = Self :: parse_filter ( ) ;
31+
2632 Criterion {
2733 codspeed : Some ( Rc :: new ( RefCell :: new ( CodSpeed :: new ( ) ) ) ) ,
2834 current_file : String :: new ( ) ,
2935 macro_group : String :: new ( ) ,
36+ filter,
3037 phantom : PhantomData ,
3138 }
3239 }
3340
41+ fn parse_filter ( ) -> BenchmarkFilter {
42+ use clap:: { Arg , Command } ;
43+
44+ let matches = Command :: new ( "Criterion Benchmark" )
45+ . arg (
46+ Arg :: new ( "FILTER" )
47+ . help ( "Skip benchmarks whose names do not contain FILTER." )
48+ . index ( 1 ) ,
49+ )
50+ . arg (
51+ Arg :: new ( "exact" )
52+ . long ( "exact" )
53+ . num_args ( 0 )
54+ . help ( "Run benchmarks that exactly match the provided filter" ) ,
55+ )
56+ . get_matches ( ) ;
57+
58+ if let Some ( filter) = matches. get_one :: < String > ( "FILTER" ) {
59+ if matches. get_flag ( "exact" ) {
60+ BenchmarkFilter :: Exact ( filter. to_owned ( ) )
61+ } else {
62+ let regex = Regex :: new ( filter) . unwrap_or_else ( |err| {
63+ eprintln ! ( "Unable to parse '{filter}' as a regular expression: {err}" ) ;
64+ std:: process:: exit ( 1 ) ;
65+ } ) ;
66+ BenchmarkFilter :: Regex ( regex)
67+ }
68+ } else {
69+ BenchmarkFilter :: AcceptAll
70+ }
71+ }
72+
3473 pub fn with_patched_measurement < M : Measurement > ( & mut self , _: Criterion < M > ) -> Criterion < M > {
3574 Criterion {
3675 codspeed : self . codspeed . clone ( ) ,
3776 current_file : self . current_file . clone ( ) ,
3877 macro_group : self . macro_group . clone ( ) ,
78+ filter : self . filter . clone ( ) ,
3979 phantom : PhantomData ,
4080 }
4181 }
@@ -92,6 +132,7 @@ impl Default for Criterion {
92132 codspeed : None ,
93133 current_file : String :: new ( ) ,
94134 macro_group : String :: new ( ) ,
135+ filter : BenchmarkFilter :: AcceptAll ,
95136 phantom : PhantomData ,
96137 }
97138 }
@@ -104,6 +145,7 @@ impl<M: Measurement> Criterion<M> {
104145 codspeed : self . codspeed ,
105146 current_file : self . current_file ,
106147 macro_group : self . macro_group ,
148+ filter : self . filter ,
107149 phantom : PhantomData :: < * const M2 > ,
108150 }
109151 }
0 commit comments