pub const DEFAULT_TRUNCATION_SUFFIX: &str = "...";
pub fn truncate_string(s: &str, max_chars: usize) -> String {
truncate_with_suffix(s, max_chars, DEFAULT_TRUNCATION_SUFFIX)
}
pub fn truncate_with_suffix(s: &str, max_chars: usize, suffix: &str) -> String {
let char_count = s.chars().count();
if char_count <= max_chars {
return s.to_string();
}
let suffix_len = suffix.chars().count();
let take_chars = max_chars.saturating_sub(suffix_len);
let truncated: String = s.chars().take(take_chars).collect();
format!("{}{}", truncated, suffix)
}
pub fn truncate_middle(s: &str, max_chars: usize) -> String {
let char_count = s.chars().count();
if char_count <= max_chars {
return s.to_string();
}
let suffix = "...";
let suffix_char_count = suffix.chars().count();
if max_chars <= suffix_char_count {
return suffix.chars().take(max_chars).collect();
}
let available = max_chars - suffix_char_count;
let start_len = available.div_ceil(2);
let end_len = available / 2;
let start: String = s.chars().take(start_len).collect();
let end: String = s.chars().skip(char_count - end_len).collect();
format!("{}{}{}", start, suffix, end)
}