1use crate::types::object::OnionObject;
2pub mod fastmap;
3
4const MAX_DEBUG_LEN: usize = 120; pub fn format_object_summary(obj: &OnionObject) -> String {
8 let debug_str = obj.repr(&vec![]).unwrap_or("<unknown>".to_string());
10
11 if debug_str.len() > MAX_DEBUG_LEN {
12 let mut truncated: String = debug_str.chars().take(MAX_DEBUG_LEN).collect();
15 truncated.push_str("...");
16 truncated
17 } else {
18 debug_str
20 }
21}
22
23
24pub fn find_line_and_col_from_source(char_pos: usize, source: &str) -> (usize, usize) {
27 let chars: Vec<char> = source.chars().collect();
28
29 if char_pos >= chars.len() {
31 let line_count = source.lines().count();
32 return (line_count.saturating_sub(1), 0);
33 }
34
35 let mut current_line = 0;
37 let mut current_col = 0;
38
39 for (i, &ch) in chars.iter().enumerate() {
40 if i == char_pos {
41 return (current_line, current_col);
42 }
43
44 if ch == '\n' {
45 current_line += 1;
46 current_col = 0;
47 } else if ch == '\r' {
48 if i + 1 < chars.len() && chars[i + 1] == '\n' {
50 continue;
52 } else {
53 current_line += 1;
55 current_col = 0;
56 }
57 } else {
58 current_col += 1;
59 }
60 }
61
62 (current_line, current_col)
64}