project: Use checked_sub
for next/previous in search history (#34408)
Use `checked_sub` instead of checking for bounds manually. Also greatly simplifies the logic for `next` and `previous`. Removing other manual bounds checks as well Release Notes: - N/A
This commit is contained in:
parent
d1abba0d33
commit
bd78f2c493
2 changed files with 11 additions and 25 deletions
|
@ -72,18 +72,12 @@ impl SearchHistory {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn next(&mut self, cursor: &mut SearchHistoryCursor) -> Option<&str> {
|
pub fn next(&mut self, cursor: &mut SearchHistoryCursor) -> Option<&str> {
|
||||||
let history_size = self.history.len();
|
|
||||||
if history_size == 0 {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
let selected = cursor.selection?;
|
let selected = cursor.selection?;
|
||||||
if selected == history_size - 1 {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
let next_index = selected + 1;
|
let next_index = selected + 1;
|
||||||
|
|
||||||
|
let next = self.history.get(next_index)?;
|
||||||
cursor.selection = Some(next_index);
|
cursor.selection = Some(next_index);
|
||||||
Some(&self.history[next_index])
|
Some(next)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn current(&self, cursor: &SearchHistoryCursor) -> Option<&str> {
|
pub fn current(&self, cursor: &SearchHistoryCursor) -> Option<&str> {
|
||||||
|
@ -92,25 +86,17 @@ impl SearchHistory {
|
||||||
.and_then(|selected_ix| self.history.get(selected_ix).map(|s| s.as_str()))
|
.and_then(|selected_ix| self.history.get(selected_ix).map(|s| s.as_str()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the previous history entry using the given `SearchHistoryCursor`.
|
||||||
|
/// Uses the last element in the history when there is no cursor.
|
||||||
pub fn previous(&mut self, cursor: &mut SearchHistoryCursor) -> Option<&str> {
|
pub fn previous(&mut self, cursor: &mut SearchHistoryCursor) -> Option<&str> {
|
||||||
let history_size = self.history.len();
|
|
||||||
if history_size == 0 {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
let prev_index = match cursor.selection {
|
let prev_index = match cursor.selection {
|
||||||
Some(selected_index) => {
|
Some(index) => index.checked_sub(1)?,
|
||||||
if selected_index == 0 {
|
None => self.history.len().checked_sub(1)?,
|
||||||
return None;
|
|
||||||
} else {
|
|
||||||
selected_index - 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => history_size - 1,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let previous = self.history.get(prev_index)?;
|
||||||
cursor.selection = Some(prev_index);
|
cursor.selection = Some(prev_index);
|
||||||
Some(&self.history[prev_index])
|
Some(previous)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -169,7 +169,7 @@ impl Project {
|
||||||
.read(cx)
|
.read(cx)
|
||||||
.get_cli_environment()
|
.get_cli_environment()
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
env.extend(settings.env.clone());
|
env.extend(settings.env);
|
||||||
|
|
||||||
match self.ssh_details(cx) {
|
match self.ssh_details(cx) {
|
||||||
Some(SshDetails {
|
Some(SshDetails {
|
||||||
|
@ -247,7 +247,7 @@ impl Project {
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
// Then extend it with the explicit env variables from the settings, so they take
|
// Then extend it with the explicit env variables from the settings, so they take
|
||||||
// precedence.
|
// precedence.
|
||||||
env.extend(settings.env.clone());
|
env.extend(settings.env);
|
||||||
|
|
||||||
let local_path = if is_ssh_terminal { None } else { path.clone() };
|
let local_path = if is_ssh_terminal { None } else { path.clone() };
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue