pub fn get_safe_preview(content: impl Into<String>, max_length: usize) -> String {
let content: String = content.into();
if content.len() <= max_length {
content
} else {
let mut preview_chars = content.chars().take(max_length);
let mut preview: String = preview_chars.by_ref().collect(); while let Some(last_char) = preview.chars().last() {
if !content.chars().skip(max_length - 1).next().unwrap_or('\0').eq(&last_char) {
preview.pop();
} else {
break;
}
}
preview
}
}
pub fn get_safe_preview_bytes(content: &[u8], max_length: usize) -> Vec<u8> {
if content.is_empty() {
return Vec::new();
}
if content.len() <= max_length {
content.to_vec()
} else {
let preview_slice = &content.get(..max_length.min(content.len())).unwrap_or_default();
if preview_slice.is_empty() {
return Vec::new();
}
let mut preview = preview_slice.to_vec();
while !preview.is_empty() {
if let Ok(_) = std::str::from_utf8(&preview) {
break;
}
preview.pop();
}
preview
}
}