pub(crate) fn line_col_bytes(text: &str, pos: usize) -> (usize, usize) {
let mut line = 1usize;
let mut last_nl: Option<usize> = None;
for (i, b) in text.as_bytes()[..pos.min(text.len())].iter().enumerate() {
if *b == b'\n' {
line += 1;
last_nl = Some(i);
}
}
let col = match last_nl {
Some(i) => pos - i,
None => pos + 1,
};
(line, col)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn line_col_bytes_first_line_first_column() {
assert_eq!(line_col_bytes("abc", 0), (1, 1));
}
#[test]
fn line_col_bytes_reports_line_two_after_a_newline() {
assert_eq!(line_col_bytes("a\nbc", 3), (2, 2));
}
}