use async_trait::async_trait; use atuin_client::{ database::{Context, Database}, history::History, settings::{FilterMode, SearchMode}, }; use eyre::Result; use super::cursor::Cursor; pub mod db; pub mod skim; pub fn engine(search_mode: SearchMode) -> Box { match search_mode { SearchMode::Skim => Box::new(skim::Search::new()) as Box<_>, mode => Box::new(db::Search(mode)) as Box<_>, } } pub struct SearchState { pub input: Cursor, pub filter_mode: FilterMode, pub context: Context, } #[async_trait] pub trait SearchEngine: Send + Sync + 'static { async fn full_query( &mut self, state: &SearchState, db: &mut dyn Database, ) -> Result>; async fn query(&mut self, state: &SearchState, db: &mut dyn Database) -> Result> { if state.input.as_str().is_empty() { Ok(db .list(state.filter_mode, &state.context, Some(200), true) .await? .into_iter() .collect::>()) } else { self.full_query(state, db).await } } }