1pub fn get_safe_preview(content: impl Into<String>, max_length: usize) -> String {
3 let content: String = content.into();
4 if content.len() <= max_length {
5 content
7 } else {
8 let mut preview_chars = content.chars().take(max_length);
10 let mut preview: String = preview_chars.by_ref().collect(); while let Some(last_char) = preview.chars().last() {
14 if !content.chars().skip(max_length - 1).next().unwrap_or('\0').eq(&last_char) {
15 preview.pop();
17 } else {
18 break;
19 }
20 }
21
22 preview
23 }
24}
25pub fn get_safe_preview_bytes(content: &[u8], max_length: usize) -> Vec<u8> {
27 if content.is_empty() {
28 return Vec::new();
29 }
30 if content.len() <= max_length {
31 content.to_vec()
33 } else {
34 let preview_slice = &content.get(..max_length.min(content.len())).unwrap_or_default();
36 if preview_slice.is_empty() {
37 return Vec::new();
38 }
39 let mut preview = preview_slice.to_vec();
40 while !preview.is_empty() {
42 if let Ok(_) = std::str::from_utf8(&preview) {
43 break;
44 }
45 preview.pop();
46 }
47
48 preview
49 }
50}