pub fn floor_char_boundary(s: &str, mut index: usize) -> usize {
if index > s.len() {
index = s.len();
}
while index > 0 && !s.is_char_boundary(index) {
index -= 1;
}
index
}
pub fn ceil_char_boundary(s: &str, mut index: usize) -> usize {
if index > s.len() {
index = s.len();
}
while index < s.len() && !s.is_char_boundary(index) {
index += 1;
}
index
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn snaps_multibyte_scalars_without_passing_the_ends() {
let text = "ó📄你";
assert_eq!(floor_char_boundary(text, 0), 0);
assert_eq!(floor_char_boundary(text, 1), 0);
assert_eq!(ceil_char_boundary(text, 1), 2);
assert_eq!(floor_char_boundary(text, text.len() + 5), text.len());
assert_eq!(ceil_char_boundary(text, text.len()), text.len());
assert!(text.is_char_boundary(floor_char_boundary(text, 3)));
assert!(text.is_char_boundary(ceil_char_boundary(text, 3)));
}
}