Skip to content

Commit 52fbf84

Browse files
refactor: extract file-gathering into new internal FileSpec API (#174)
2 parents d5d97bf + 60d3a2e commit 52fbf84

2 files changed

Lines changed: 141 additions & 102 deletions

File tree

moz-webgpu-cts/src/file_spec.rs

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
use std::{fmt::Display, path::PathBuf};
2+
3+
use miette::Report;
4+
use wax::Glob;
5+
6+
use crate::AlreadyReportedToCommandline;
7+
8+
pub(crate) struct FileSpec {
9+
pub paths: Vec<PathBuf>,
10+
pub globs: Vec<String>,
11+
}
12+
13+
impl FileSpec {
14+
pub(crate) fn into_paths(
15+
self,
16+
what: impl Display,
17+
) -> Result<Vec<PathBuf>, AlreadyReportedToCommandline> {
18+
let Self { paths, globs } = self;
19+
20+
let globs = {
21+
let mut found_glob_parse_err = false;
22+
let globs = globs
23+
.into_iter()
24+
.filter_map(|glob| match Glob::diagnosed(&glob) {
25+
Ok((glob, _diagnostics)) => Some(glob.into_owned().partition()),
26+
Err(diagnostics) => {
27+
found_glob_parse_err = true;
28+
let error_reports = diagnostics
29+
.into_iter()
30+
.filter(|diag| {
31+
// N.B.: There should be at least one of these!
32+
diag.severity()
33+
.is_none_or(|sev| sev == miette::Severity::Error)
34+
})
35+
.map(Report::new_boxed);
36+
for report in error_reports {
37+
eprintln!("{report:?}");
38+
}
39+
None
40+
}
41+
})
42+
.collect::<Vec<_>>();
43+
44+
if found_glob_parse_err {
45+
log::error!("failed to parse one or more globs for {what}; bailing");
46+
return Err(AlreadyReportedToCommandline);
47+
}
48+
49+
globs
50+
};
51+
52+
let paths_from_globs = {
53+
let mut found_glob_walk_err = false;
54+
let files = globs
55+
.iter()
56+
.flat_map(|(base_path, glob)| {
57+
glob.walk(base_path)
58+
.filter_map(|entry| match entry {
59+
Ok(entry) => Some(entry.into_path()),
60+
Err(e) => {
61+
found_glob_walk_err = true;
62+
let ctx_msg = if let Some(path) = e.path() {
63+
format!(
64+
"failed to enumerate {what} from glob `{}` at path {}",
65+
glob,
66+
path.display()
67+
)
68+
} else {
69+
format!("failed to enumerate {what} from glob `{glob}`")
70+
};
71+
let e = Report::msg(e).wrap_err(ctx_msg);
72+
eprintln!("{e:?}");
73+
None
74+
}
75+
})
76+
.collect::<Vec<_>>() // OPT: Can we get rid of this somehow?
77+
})
78+
.collect::<Vec<_>>();
79+
80+
if found_glob_walk_err {
81+
log::error!(
82+
concat!(
83+
"failed to enumerate {} from globs, ",
84+
"see above for more details"
85+
),
86+
what
87+
);
88+
return Err(AlreadyReportedToCommandline);
89+
}
90+
91+
files
92+
};
93+
94+
if paths_from_globs.is_empty() && !globs.is_empty() {
95+
if paths.is_empty() {
96+
log::error!(
97+
concat!(
98+
"{} were specified exclusively via glob search, ",
99+
"but none were found; bailing"
100+
),
101+
what
102+
);
103+
return Err(AlreadyReportedToCommandline);
104+
} else {
105+
log::warn!(
106+
concat!(
107+
"{} were specified via path and glob search, ",
108+
"but none were found via glob; ",
109+
"continuing with direct paths"
110+
),
111+
what
112+
)
113+
}
114+
}
115+
116+
let exec_report_paths = paths
117+
.into_iter()
118+
.chain(paths_from_globs)
119+
.collect::<Vec<_>>();
120+
121+
log::trace!("working with the following {what}: {exec_report_paths:#?}");
122+
log::info!("working with {} {what}", exec_report_paths.len());
123+
124+
Ok(exec_report_paths)
125+
}
126+
}

moz-webgpu-cts/src/main.rs

Lines changed: 15 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1+
mod file_spec;
12
mod process_reports;
23
mod report;
34
mod wpt;
45

5-
use self::wpt::{
6-
metadata::{
7-
self,
8-
properties::{ExpandedPropertyValue, Expected},
9-
File, ImplementationStatus, Platform, Subtest, SubtestOutcome, Test, TestOutcome,
10-
TestProps,
6+
use self::{
7+
file_spec::FileSpec,
8+
wpt::{
9+
metadata::{
10+
self,
11+
properties::{ExpandedPropertyValue, Expected},
12+
File, ImplementationStatus, Platform, Subtest, SubtestOutcome, Test, TestOutcome,
13+
TestProps,
14+
},
15+
path::TestEntryPath,
1116
},
12-
path::TestEntryPath,
1317
};
1418

1519
use std::{
@@ -161,102 +165,11 @@ impl ExecReportSpec {
161165
report_globs,
162166
} = self;
163167

164-
let report_globs = {
165-
let mut found_glob_parse_err = false;
166-
let globs = report_globs
167-
.into_iter()
168-
.filter_map(|glob| match Glob::diagnosed(&glob) {
169-
Ok((glob, _diagnostics)) => Some(glob.into_owned().partition()),
170-
Err(diagnostics) => {
171-
found_glob_parse_err = true;
172-
let error_reports = diagnostics
173-
.into_iter()
174-
.filter(|diag| {
175-
// N.B.: There should be at least one of these!
176-
diag.severity()
177-
.is_none_or(|sev| sev == miette::Severity::Error)
178-
})
179-
.map(Report::new_boxed);
180-
for report in error_reports {
181-
eprintln!("{report:?}");
182-
}
183-
None
184-
}
185-
})
186-
.collect::<Vec<_>>();
187-
188-
if found_glob_parse_err {
189-
log::error!("failed to parse one or more WPT report globs; bailing");
190-
return Err(AlreadyReportedToCommandline);
191-
}
192-
193-
globs
194-
};
195-
196-
let report_paths_from_glob = {
197-
let mut found_glob_walk_err = false;
198-
let files = report_globs
199-
.iter()
200-
.flat_map(|(base_path, glob)| {
201-
glob.walk(base_path)
202-
.filter_map(|entry| match entry {
203-
Ok(entry) => Some(entry.into_path()),
204-
Err(e) => {
205-
found_glob_walk_err = true;
206-
let ctx_msg = if let Some(path) = e.path() {
207-
format!(
208-
"failed to enumerate files for glob `{}` at path {}",
209-
glob,
210-
path.display()
211-
)
212-
} else {
213-
format!("failed to enumerate files for glob `{glob}`")
214-
};
215-
let e = Report::msg(e).wrap_err(ctx_msg);
216-
eprintln!("{e:?}");
217-
None
218-
}
219-
})
220-
.collect::<Vec<_>>() // OPT: Can we get rid of this somehow?
221-
})
222-
.collect::<Vec<_>>();
223-
224-
if found_glob_walk_err {
225-
log::error!(concat!(
226-
"failed to enumerate files with WPT report globs, ",
227-
"see above for more details"
228-
));
229-
return Err(AlreadyReportedToCommandline);
230-
}
231-
232-
files
233-
};
234-
235-
if report_paths_from_glob.is_empty() && !report_globs.is_empty() {
236-
if report_paths.is_empty() {
237-
log::error!(concat!(
238-
"reports were specified exclusively via glob search, ",
239-
"but none were found; bailing"
240-
));
241-
return Err(AlreadyReportedToCommandline);
242-
} else {
243-
log::warn!(concat!(
244-
"reports were specified via path and glob search, ",
245-
"but none were found via glob; ",
246-
"continuing with report paths"
247-
))
248-
}
168+
FileSpec {
169+
paths: report_paths,
170+
globs: report_globs,
249171
}
250-
251-
let exec_report_paths = report_paths
252-
.into_iter()
253-
.chain(report_paths_from_glob)
254-
.collect::<Vec<_>>();
255-
256-
log::trace!("working with the following WPT report files: {exec_report_paths:#?}");
257-
log::info!("working with {} WPT report files", exec_report_paths.len());
258-
259-
Ok(exec_report_paths)
172+
.into_paths("WPT report(s)")
260173
}
261174
}
262175

0 commit comments

Comments
 (0)