pub fn deltochar(
buffer: &str,
cursor: usize,
target: char,
direction: i32,
inclusive: bool,
) -> Option<(usize, usize)> {
if direction >= 0 {
let search_area = &buffer[cursor..];
if let Some(pos) = search_area.find(target) {
let end = cursor + pos + if inclusive { target.len_utf8() } else { 0 };
Some((cursor, end))
} else {
None
}
} else {
let search_area = &buffer[..cursor];
if let Some(pos) = search_area.rfind(target) {
let start = if inclusive {
pos
} else {
pos + target.len_utf8()
};
Some((start, cursor))
} else {
None
}
}
}
pub fn apply_deltochar(
buffer: &str,
cursor: usize,
target: char,
direction: i32,
inclusive: bool,
) -> Option<(String, usize)> {
let (start, end) = deltochar(buffer, cursor, target, direction, inclusive)?;
let mut result = String::with_capacity(buffer.len());
result.push_str(&buffer[..start]);
result.push_str(&buffer[end..]);
Some((result, start))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deltochar_forward() {
let (start, end) = deltochar("hello world", 0, 'o', 1, true).unwrap();
assert_eq!(start, 0);
assert_eq!(end, 5); }
#[test]
fn test_deltochar_forward_exclusive() {
let (start, end) = deltochar("hello world", 0, 'o', 1, false).unwrap();
assert_eq!(start, 0);
assert_eq!(end, 4); }
#[test]
fn test_deltochar_backward() {
let (start, end) = deltochar("hello world", 11, 'o', -1, true).unwrap();
assert_eq!(start, 7); assert_eq!(end, 11);
}
#[test]
fn test_deltochar_not_found() {
assert!(deltochar("hello", 0, 'z', 1, true).is_none());
}
#[test]
fn test_apply_deltochar() {
let (result, cursor) = apply_deltochar("hello world", 0, 'o', 1, true).unwrap();
assert_eq!(result, " world");
assert_eq!(cursor, 0);
}
}