Skip to content

Commit 2a5b586

Browse files
committed
address review comment
rust-lang#1394 (comment) Much more clean
1 parent ade2924 commit 2a5b586

File tree

1 file changed

+54
-55
lines changed

1 file changed

+54
-55
lines changed

ci/date-check/src/main.rs

+54-55
Original file line numberDiff line numberDiff line change
@@ -36,52 +36,51 @@ impl fmt::Display for Date {
3636
}
3737
}
3838

39-
fn make_date_regex() -> Vec<Regex> {
40-
Vec::from([
41-
Regex::new(r"<!--\s+date-check:\s+(\D+)\s+(\d{4})\s+-->").unwrap(),
42-
Regex::new(r"<!--\s+date-check\s+-->\s+(\D+)\s+(\d{4})\b").unwrap(),
43-
])
39+
fn make_date_regex() -> Regex {
40+
Regex::new(
41+
r"(?x)
42+
(?:<!--\s+date-check:\s+(\D+)\s+(\d{4})\s+-->)|
43+
(?:<!--\s+date-check\s+-->\s+(\D+)\s+(\d{4})\b)
44+
",
45+
)
46+
.unwrap()
4447
}
4548

46-
fn collect_dates_from_file(date_regexes: &[Regex], text: &str) -> Vec<(usize, Date)> {
47-
let mut output = Vec::new();
48-
for date_regex in date_regexes {
49-
let mut line = 1;
50-
let mut end_of_last_cap = 0;
51-
let results: Vec<_> = date_regex
52-
.captures_iter(text)
53-
.filter_map(|cap| {
54-
if let (Some(year), Some(month)) = (cap.get(2), cap.get(1)) {
55-
let year = year.as_str().parse().expect("year");
56-
let month = Month::from_str(month.as_str())
57-
.expect("month")
58-
.number_from_month();
59-
Some((cap.get(0).expect("all").range(), Date { year, month }))
60-
} else {
61-
None
62-
}
63-
})
64-
.map(|(byte_range, date)| {
65-
line += text[end_of_last_cap..byte_range.end]
66-
.chars()
67-
.filter(|c| *c == '\n')
68-
.count();
69-
end_of_last_cap = byte_range.end;
70-
(line, date)
71-
})
72-
.collect();
73-
output.extend(results);
74-
}
75-
output.sort_by_key(|a| a.0);
76-
output
49+
fn collect_dates_from_file(date_regex: &Regex, text: &str) -> Vec<(usize, Date)> {
50+
let mut line = 1;
51+
let mut end_of_last_cap = 0;
52+
date_regex
53+
.captures_iter(text)
54+
.filter_map(|cap| {
55+
if let (Some(month), Some(year), None, None) | (None, None, Some(month), Some(year)) =
56+
(cap.get(1), cap.get(2), cap.get(3), cap.get(4))
57+
{
58+
let year = year.as_str().parse().expect("year");
59+
let month = Month::from_str(month.as_str())
60+
.expect("month")
61+
.number_from_month();
62+
Some((cap.get(0).expect("all").range(), Date { year, month }))
63+
} else {
64+
None
65+
}
66+
})
67+
.map(|(byte_range, date)| {
68+
line += text[end_of_last_cap..byte_range.end]
69+
.chars()
70+
.filter(|c| *c == '\n')
71+
.count();
72+
end_of_last_cap = byte_range.end;
73+
(line, date)
74+
})
75+
.collect()
7776
}
7877

7978
fn collect_dates(paths: impl Iterator<Item = PathBuf>) -> BTreeMap<PathBuf, Vec<(usize, Date)>> {
80-
let date_regexes = make_date_regex();
79+
let date_regex = make_date_regex();
8180
let mut data = BTreeMap::new();
8281
for path in paths {
8382
let text = fs::read_to_string(&path).unwrap();
84-
let dates = collect_dates_from_file(&date_regexes, &text);
83+
let dates = collect_dates_from_file(&date_regex, &text);
8584
if !dates.is_empty() {
8685
data.insert(path, dates);
8786
}
@@ -185,29 +184,29 @@ mod tests {
185184

186185
#[test]
187186
fn test_date_regex() {
188-
let regexes = &make_date_regex();
189-
assert!(regexes[0].is_match("<!-- date-check: jan 2021 -->"));
190-
assert!(regexes[0].is_match("<!-- date-check: january 2021 -->"));
191-
assert!(regexes[0].is_match("<!-- date-check: Jan 2021 -->"));
192-
assert!(regexes[0].is_match("<!-- date-check: January 2021 -->"));
193-
assert!(regexes[1].is_match("<!-- date-check --> jan 2021"));
194-
assert!(regexes[1].is_match("<!-- date-check --> january 2021"));
195-
assert!(regexes[1].is_match("<!-- date-check --> Jan 2021"));
196-
assert!(regexes[1].is_match("<!-- date-check --> January 2021"));
187+
let regex = &make_date_regex();
188+
assert!(regex.is_match("<!-- date-check: jan 2021 -->"));
189+
assert!(regex.is_match("<!-- date-check: january 2021 -->"));
190+
assert!(regex.is_match("<!-- date-check: Jan 2021 -->"));
191+
assert!(regex.is_match("<!-- date-check: January 2021 -->"));
192+
assert!(regex.is_match("<!-- date-check --> jan 2021"));
193+
assert!(regex.is_match("<!-- date-check --> january 2021"));
194+
assert!(regex.is_match("<!-- date-check --> Jan 2021"));
195+
assert!(regex.is_match("<!-- date-check --> January 2021"));
197196

198-
assert!(regexes[1].is_match("<!-- date-check --> jan 2021 "));
199-
assert!(regexes[1].is_match("<!-- date-check --> jan 2021."));
197+
assert!(regex.is_match("<!-- date-check --> jan 2021 "));
198+
assert!(regex.is_match("<!-- date-check --> jan 2021."));
200199
}
201200

202201
#[test]
203202
fn test_date_regex_fail() {
204203
let regexes = &make_date_regex();
205-
assert!(!regexes[0].is_match("<!-- date-check: jan 221 -->"));
206-
assert!(!regexes[0].is_match("<!-- date-check: jan 20221 -->"));
207-
assert!(!regexes[0].is_match("<!-- date-check: 01 2021 -->"));
208-
assert!(!regexes[1].is_match("<!-- date-check --> jan 221"));
209-
assert!(!regexes[1].is_match("<!-- date-check --> jan 20222"));
210-
assert!(!regexes[1].is_match("<!-- date-check --> 01 2021"));
204+
assert!(!regexes.is_match("<!-- date-check: jan 221 -->"));
205+
assert!(!regexes.is_match("<!-- date-check: jan 20221 -->"));
206+
assert!(!regexes.is_match("<!-- date-check: 01 2021 -->"));
207+
assert!(!regexes.is_match("<!-- date-check --> jan 221"));
208+
assert!(!regexes.is_match("<!-- date-check --> jan 20222"));
209+
assert!(!regexes.is_match("<!-- date-check --> 01 2021"));
211210
}
212211

213212
#[test]

0 commit comments

Comments
 (0)