use super::*;
#[derive(Debug, Eq, PartialEq)]
pub enum DeletionStage {
NotFlagged,
Flagged,
}
#[derive(Debug, Eq, PartialEq)]
pub struct Query {
pub input: String,
pub results: QueryResult,
pub selected_result_index: Option<usize>,
pub deletion_stage: DeletionStage,
}
impl Default for Query {
fn default() -> Self {
Query {
input: String::from(""),
results: vec![],
selected_result_index: None,
deletion_stage: DeletionStage::NotFlagged,
}
}
}
impl Query {
pub fn new(results: QueryResult) -> Query {
let is_empty = results.is_empty();
Query {
input: String::from(""),
results,
selected_result_index: if is_empty { None } else { Some(0) },
deletion_stage: DeletionStage::NotFlagged,
}
}
pub fn flatten_results(&self) -> Vec<(String, String, usize, Option<usize>)> {
let mut result: Vec<(String, String, usize, Option<usize>)> = vec![];
let mut i = 0 as usize;
for (category, items) in self.results.iter() {
if items.is_empty() {
result.push((category.to_owned(), String::from(""), i, None));
} else {
let mut j = 0 as usize;
for item in items {
result.push((category.to_owned(), item.to_owned(), i, Some(j)));
j += 1;
}
}
i += 1;
}
result
}
pub fn select_prev(&mut self) -> UpdateStatus {
match self.selected_result_index {
Some(index) => {
if index > 0 {
self.selected_result_index = Some(index - 1);
return UpdateStatus::Changed;
}
UpdateStatus::Unchanged
}
_ => UpdateStatus::Unchanged
}
}
pub fn select_next(&mut self) -> UpdateStatus {
let n = self.flatten_results().len();
if let Some(index) = self.selected_result_index {
if index + 1 < n {
self.selected_result_index = Some(index + 1);
return UpdateStatus::Changed;
}
}
UpdateStatus::Unchanged
}
}