pub mod diff;
pub fn truncate_str(s: &str, max_bytes: usize) -> &str {
if s.len() <= max_bytes {
return s;
}
let mut end = max_bytes;
while !s.is_char_boundary(end) {
end -= 1;
}
&s[..end]
}
pub fn tail_str(s: &str, max_bytes: usize) -> &str {
if s.len() <= max_bytes {
return s;
}
let mut start = s.len() - max_bytes;
while !s.is_char_boundary(start) {
start += 1;
}
&s[start..]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn truncate_ascii() {
assert_eq!(truncate_str("hello", 3), "hel");
assert_eq!(truncate_str("hello", 5), "hello");
assert_eq!(truncate_str("hello", 10), "hello");
}
#[test]
fn truncate_multibyte_boundary() {
assert_eq!(truncate_str("é", 1), "");
assert_eq!(truncate_str("aéb", 2), "a");
assert_eq!(truncate_str("🦀🦀", 5), "🦀");
assert_eq!(truncate_str("🦀🦀", 4), "🦀");
assert_eq!(truncate_str("🦀🦀", 3), "");
}
#[test]
fn tail_ascii() {
assert_eq!(tail_str("hello", 3), "llo");
assert_eq!(tail_str("hello", 5), "hello");
assert_eq!(tail_str("hello", 10), "hello");
}
#[test]
fn tail_multibyte_boundary() {
assert_eq!(tail_str("aéb", 2), "b");
assert_eq!(tail_str("🦀🦀", 5), "🦀");
assert_eq!(tail_str("🦀🦀", 3), "");
}
#[test]
fn empty_string() {
assert_eq!(truncate_str("", 5), "");
assert_eq!(tail_str("", 5), "");
}
}