@@ -21,7 +21,7 @@ use std::{
21
21
num:: NonZeroU64 ,
22
22
path:: { Path , PathBuf } ,
23
23
process:: ExitCode ,
24
- sync:: Arc ,
24
+ sync:: { mpsc :: channel , Arc } ,
25
25
} ;
26
26
27
27
use clap:: Parser ;
@@ -30,6 +30,7 @@ use indexmap::{IndexMap, IndexSet};
30
30
use miette:: { miette, Diagnostic , IntoDiagnostic , NamedSource , Report , SourceSpan , WrapErr } ;
31
31
use path_dsl:: path;
32
32
33
+ use rayon:: prelude:: { IntoParallelIterator , ParallelIterator } ;
33
34
use regex:: Regex ;
34
35
use wax:: Glob ;
35
36
use whippit:: {
@@ -347,30 +348,34 @@ fn run(cli: Cli) -> ExitCode {
347
348
348
349
log:: info!( "gathering reported test outcomes for comparison to metadata…" ) ;
349
350
350
- let exec_reports_iter = exec_report_paths. iter ( ) . map ( |path| {
351
- fs:: File :: open ( path)
352
- . map ( BufReader :: new)
353
- . map_err ( Report :: msg)
354
- . wrap_err ( "failed to open file" )
355
- . and_then ( |reader| {
356
- serde_json:: from_reader :: < _ , ExecutionReport > ( reader)
357
- . into_diagnostic ( )
358
- . wrap_err ( "failed to parse JSON" )
359
- } )
360
- . map ( |parsed| ( path, parsed) )
361
- . wrap_err_with ( || {
362
- format ! (
363
- "failed to read WPT execution report from {}" ,
364
- path. display( )
365
- )
366
- } )
367
- . map_err ( |e| {
368
- log:: error!( "{e:?}" ) ;
369
- AlreadyReportedToCommandline
370
- } )
371
- } ) ;
372
-
373
- for res in exec_reports_iter {
351
+ let ( exec_reports_sender, exec_reports_receiver) = channel ( ) ;
352
+ exec_report_paths
353
+ . into_par_iter ( )
354
+ . for_each_with ( exec_reports_sender, |sender, path| {
355
+ let res = fs:: File :: open ( & path)
356
+ . map ( BufReader :: new)
357
+ . map_err ( Report :: msg)
358
+ . wrap_err ( "failed to open file" )
359
+ . and_then ( |reader| {
360
+ serde_json:: from_reader :: < _ , ExecutionReport > ( reader)
361
+ . into_diagnostic ( )
362
+ . wrap_err ( "failed to parse JSON" )
363
+ } )
364
+ . wrap_err_with ( || {
365
+ format ! (
366
+ "failed to read WPT execution report from {}" ,
367
+ path. display( )
368
+ )
369
+ } )
370
+ . map ( |parsed| ( path, parsed) )
371
+ . map_err ( |e| {
372
+ log:: error!( "{e:?}" ) ;
373
+ AlreadyReportedToCommandline
374
+ } ) ;
375
+ let _ = sender. send ( res) ;
376
+ } ) ;
377
+
378
+ for res in exec_reports_receiver {
374
379
let ( _path, exec_report) = match res {
375
380
Ok ( ok) => ok,
376
381
Err ( AlreadyReportedToCommandline ) => return ExitCode :: FAILURE ,
0 commit comments