mj 0.4.3

My Journal - personal tool to capture ideas, work with journals, notes and tasks in your favourite text $EDITOR.
Documentation
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
  }
}