pub trait AutocompleteProvider: Send + Sync {
#[must_use]
fn can_autocomplete(&self) -> bool;
#[must_use]
fn get_displayable_suggestion(&self, current_input: String) -> Option<String>;
#[must_use]
fn get_tab_completion(
&self,
last_completion_index: Option<usize>,
input: &str,
) -> Option<String>;
}
#[cfg(test)]
pub mod test_helpers {
use super::*;
pub struct AutocompleteSuggestionList(pub Vec<String>);
impl AutocompleteProvider for AutocompleteSuggestionList {
fn can_autocomplete(&self) -> bool {
true
}
fn get_displayable_suggestion(&self, current_input: String) -> Option<String> {
self.get_tab_completion(None, ¤t_input)
}
fn get_tab_completion(
&self,
last_completion_index: Option<usize>,
input: &str,
) -> Option<String> {
let to_ignore_count = last_completion_index.map(|val| val + 1).unwrap_or_default();
let mut ignored = 0_usize;
for suggestion in &self.0 {
if input.len() >= suggestion.len() {
continue;
}
if suggestion.starts_with(input) {
if ignored >= to_ignore_count {
return Some(suggestion[input.len()..].to_owned());
} else {
ignored += 1;
}
}
}
None
}
}
}