Function codespan_reporting::files::line_starts
source · pub fn line_starts<'source>(
source: &'source str
) -> impl 'source + Iterator<Item = usize>
Expand description
Return the starting byte index of each line in the source string.
This can make it easier to implement Files::line_index
by allowing
implementors of Files
to pre-compute the line starts, then search for
the corresponding line range, as shown in the example below.
Example
use codespan_reporting::files;
let source = "foo\nbar\r\n\nbaz";
let line_starts: Vec<_> = files::line_starts(source).collect();
assert_eq!(
line_starts,
[
0, // "foo\n"
4, // "bar\r\n"
9, // ""
10, // "baz"
],
);
fn line_index(line_starts: &[usize], byte_index: usize) -> Option<usize> {
match line_starts.binary_search(&byte_index) {
Ok(line) => Some(line),
Err(next_line) => Some(next_line - 1),
}
}
assert_eq!(line_index(&line_starts, 5), Some(1));