use anyhow::{bail, Result};
use crate::db::{self, CommandRecord, SearchFilter};
use crate::{backup, config};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Action {
Quit,
Select,
Up,
Down,
PageUp,
PageDown,
Home,
End,
Backspace,
Input(char),
ToggleHelp,
ToggleFilters,
ToggleDetailsFocus,
FocusSearch,
Refresh,
Copy,
ExportResults,
RequestDelete,
ConfirmYes,
ConfirmNo,
FilterProjectFromSelection,
FilterBranchFromSelection,
FilterCwdFromSelection,
FilterProjectCurrent,
FilterBranchCurrent,
CycleStatusFilter,
ClearFilters,
None,
}
pub trait TuiBackend {
fn backup_and_delete(&mut self, id: i64) -> Result<()>;
fn reload(&mut self) -> Result<Vec<CommandRecord>>;
}
pub struct DbBackend {
conn: rusqlite::Connection,
limit: usize,
}
impl DbBackend {
pub fn open(limit: usize) -> Result<Self> {
let conn = db::open(&config::db_path()?)?;
Ok(Self { conn, limit })
}
}
impl TuiBackend for DbBackend {
fn backup_and_delete(&mut self, id: i64) -> Result<()> {
let info = backup::create_backup(None)?;
let _ = info;
let n = db::delete_command(&self.conn, id)?;
if n == 0 {
bail!("commande #{id} introuvable");
}
Ok(())
}
fn reload(&mut self) -> Result<Vec<CommandRecord>> {
db::fetch_filtered(&self.conn, &SearchFilter::default(), self.limit)
}
}