htmx_lsp_util/
lib.rs

1use lsp_types::Position;
2
3pub fn byte_pos_to_line_col(source: &str, byte_pos: usize) -> Position {
4    let mut line = 0;
5    let mut col: u32 = 0;
6
7    for (idx, c) in source.chars().enumerate() {
8        if idx >= byte_pos {
9            break;
10        }
11        if c == '\n' {
12            line += 1;
13            col = 0;
14        } else {
15            col += 1;
16        }
17    }
18
19    Position {
20        line,
21        character: col.saturating_sub(1),
22    }
23}
24
25pub fn get_text_byte_offset(source: &str, line: usize, character: usize) -> Option<usize> {
26    let mut character = character;
27    let mut line = line;
28    let mut byte_offset = 0;
29
30    for l in source.lines() {
31        if line == 0 {
32            byte_offset += character;
33            character = character.saturating_sub(l.len());
34            break;
35        } else {
36            line -= 1;
37            byte_offset += l.len() + 1;
38        }
39    }
40
41    if line != 0 || character != 0 {
42        return None;
43    }
44
45    Some(byte_offset)
46}