39 lines
895 B
Rust
39 lines
895 B
Rust
|
|
// Truncate a &str to a byte budget at a char boundary (prefix)
|
||
|
|
#[inline]
|
||
|
|
pub fn take_bytes_at_char_boundary(s: &str, maxb: usize) -> &str {
|
||
|
|
if s.len() <= maxb {
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
let mut last_ok = 0;
|
||
|
|
for (i, ch) in s.char_indices() {
|
||
|
|
let nb = i + ch.len_utf8();
|
||
|
|
if nb > maxb {
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
last_ok = nb;
|
||
|
|
}
|
||
|
|
&s[..last_ok]
|
||
|
|
}
|
||
|
|
|
||
|
|
// Take a suffix of a &str within a byte budget at a char boundary
|
||
|
|
#[inline]
|
||
|
|
pub fn take_last_bytes_at_char_boundary(s: &str, maxb: usize) -> &str {
|
||
|
|
if s.len() <= maxb {
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
let mut start = s.len();
|
||
|
|
let mut used = 0usize;
|
||
|
|
for (i, ch) in s.char_indices().rev() {
|
||
|
|
let nb = ch.len_utf8();
|
||
|
|
if used + nb > maxb {
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
start = i;
|
||
|
|
used += nb;
|
||
|
|
if start == 0 {
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
&s[start..]
|
||
|
|
}
|