tidy/
iter_header.rs
1const COMMENT: &str = "//@";
2
3pub(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
11pub(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 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 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}