use crate::EditorState;
pub fn parse_tilde_range(specifier: &str, state: &mut EditorState) -> Option<(usize, usize)> {
let buffer_len = state.buffer.contents.len();
if buffer_len == 0 {
return None;
}
let start_point = 1;
let end_point = buffer_len;
let cursor = state.cursor + 1;
match specifier {
"file" => return Some((start_point, end_point)),
"around" => {
let start_around = cursor.saturating_sub(3).max(start_point);
let end_around = (cursor + 3).min(end_point);
return Some((start_around, end_around));
}
"this" | "point" => return Some((cursor, cursor)),
_ => (),
}
if specifier.matches("~").count() > 1 {
return None;
}
if specifier.starts_with("~") {
if let Ok(end) = specifier.trim_start_matches("~").parse::<usize>() {
return Some((start_point, end));
}
} else if specifier.ends_with("~") {
if let Ok(start) = specifier.trim_end_matches("~").parse::<usize>() {
return Some((start, end_point));
}
} else if specifier.contains("~") {
let range: Vec<&str> = specifier.split("~").collect();
if let Ok(start) = range[0].parse::<usize>() {
if let Ok(end) = range[1].parse::<usize>() {
if start > end {
return None;
}
return Some((start, end));
}
}
} else if let Ok(specified_line) = specifier.parse::<usize>() {
return Some((specified_line, specified_line));
}
None
}