use tui_input::Input;
use crate::command::client::{engine::Engine, shell_command::ShellCommand};
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum RunStatus {
Running,
Confirmed,
Canceled,
}
impl RunStatus {
pub fn running(&self) -> bool {
match self {
RunStatus::Running => true,
RunStatus::Confirmed | RunStatus::Canceled => false,
}
}
}
pub struct App<T: Engine> {
pub status: RunStatus,
pub search_box: Input,
pub selected: usize,
pub current_commands: Vec<ShellCommand>,
pub db: T,
}
impl<T: Engine> App<T> {
pub fn new(initial_search: String) -> Self {
let connection = T::init().expect("Failed to init database");
let commands = connection.search_commands(&initial_search);
Self {
status: RunStatus::Running,
search_box: Input::new(initial_search),
selected: 0,
current_commands: commands,
db: connection,
}
}
pub fn tick(&self) {}
pub fn confirm(&mut self) {
self.status = RunStatus::Confirmed;
}
pub fn cancel(&mut self) {
self.status = RunStatus::Canceled;
}
pub fn update_commands(&mut self) {
self.current_commands = self.db.search_commands(self.search_box.value());
self.selected = self
.current_commands
.len()
.saturating_sub(1)
.min(self.selected);
}
}