pub fn truncate_str(s: &str, max_bytes: usize) -> &str {
if s.len() <= max_bytes {
return s;
}
let mut end = max_bytes;
while end > 0 && !s.is_char_boundary(end) {
end -= 1;
}
&s[..end]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_truncate_str_ascii() {
assert_eq!(truncate_str("hello world", 5), "hello");
assert_eq!(truncate_str("hello", 10), "hello");
assert_eq!(truncate_str("hello", 5), "hello");
}
#[test]
fn test_truncate_str_multibyte_boundary() {
let s = "abc█def";
assert_eq!(truncate_str(s, 3), "abc"); assert_eq!(truncate_str(s, 4), "abc"); assert_eq!(truncate_str(s, 5), "abc"); assert_eq!(truncate_str(s, 6), "abc█"); }
#[test]
fn test_truncate_str_emoji() {
let s = "hi🦀bye";
assert_eq!(truncate_str(s, 2), "hi");
assert_eq!(truncate_str(s, 3), "hi"); assert_eq!(truncate_str(s, 5), "hi"); assert_eq!(truncate_str(s, 6), "hi🦀");
}
#[test]
fn test_truncate_str_zero() {
assert_eq!(truncate_str("hello", 0), "");
assert_eq!(truncate_str("🦀", 0), "");
}
#[test]
fn test_truncate_str_empty() {
assert_eq!(truncate_str("", 5), "");
assert_eq!(truncate_str("", 0), "");
}
#[test]
fn test_truncate_str_all_multibyte() {
let s = "███"; assert_eq!(truncate_str(s, 1), ""); assert_eq!(truncate_str(s, 3), "█");
assert_eq!(truncate_str(s, 7), "██"); assert_eq!(truncate_str(s, 9), "███");
}
}