tidy/
iter_header.rs

1const COMMENT: &str = "//@";
2
3/// A header line, like `//@name: value` consists of the prefix `//@` and the directive
4/// `name: value`. It is also possibly revisioned, e.g. `//@[revision] name: value`.
5pub(crate) struct HeaderLine<'ln> {
6    pub(crate) line_number: usize,
7    pub(crate) revision: Option<&'ln str>,
8    pub(crate) directive: &'ln str,
9}
10
11/// Iterate through compiletest headers in a test contents.
12///
13/// Adjusted from compiletest/src/header.rs.
14pub(crate) fn iter_header<'ln>(contents: &'ln str, it: &mut dyn FnMut(HeaderLine<'ln>)) {
15    for (line_number, ln) in (1..).zip(contents.lines()) {
16        let ln = ln.trim();
17
18        // We're left with potentially `[rev]name: value`.
19        let Some(remainder) = ln.strip_prefix(COMMENT) else {
20            continue;
21        };
22
23        if let Some(remainder) = remainder.trim_start().strip_prefix('[') {
24            let Some((revision, remainder)) = remainder.split_once(']') else {
25                panic!("malformed revision directive: expected `//@[rev]`, found `{ln}`");
26            };
27            // We trimmed off the `[rev]` portion, left with `name: value`.
28            it(HeaderLine { line_number, revision: Some(revision), directive: remainder.trim() });
29        } else {
30            it(HeaderLine { line_number, revision: None, directive: remainder.trim() });
31        }
32    }
33}