diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/command/client/search.rs | 107 | ||||
| -rw-r--r-- | src/command/client/search/engines/db.rs | 11 | ||||
| -rw-r--r-- | src/command/client/search/interactive.rs | 3 |
3 files changed, 32 insertions, 89 deletions
diff --git a/src/command/client/search.rs b/src/command/client/search.rs index c407eb08..fb3a1a39 100644 --- a/src/command/client/search.rs +++ b/src/command/client/search.rs @@ -1,11 +1,10 @@ use atuin_common::utils; -use chrono::Utc; use clap::Parser; use eyre::Result; use atuin_client::{ - database::current_context, database::Database, + database::{current_context, OptFilters}, history::History, settings::{FilterMode, SearchMode, Settings}, }; @@ -103,19 +102,18 @@ impl Cmd { } else { let list_mode = ListMode::from_flags(self.human, self.cmd_only); - let mut entries = run_non_interactive( - settings, - self.cwd.clone(), - self.exit, - self.exclude_exit, - self.exclude_cwd.clone(), - self.before.clone(), - self.after.clone(), - self.limit, - &self.query, - &mut db, - ) - .await?; + let opt_filter = OptFilters { + exit: self.exit, + exclude_exit: self.exclude_exit, + cwd: self.cwd, + exclude_cwd: self.exclude_cwd, + before: self.before, + after: self.after, + limit: self.limit, + }; + + let mut entries = + run_non_interactive(settings, opt_filter.clone(), &self.query, &mut db).await?; if entries.is_empty() { std::process::exit(1) @@ -132,19 +130,9 @@ impl Cmd { db.delete(entry.clone()).await?; } - entries = run_non_interactive( - settings, - self.cwd.clone(), - self.exit, - self.exclude_exit, - self.exclude_cwd.clone(), - self.before.clone(), - self.after.clone(), - self.limit, - &self.query, - &mut db, - ) - .await?; + entries = + run_non_interactive(settings, opt_filter.clone(), &self.query, &mut db) + .await?; } } else { super::history::print_list(&entries, list_mode, self.format.as_deref()); @@ -159,33 +147,22 @@ impl Cmd { #[allow(clippy::too_many_arguments)] async fn run_non_interactive( settings: &Settings, - cwd: Option<String>, - exit: Option<i64>, - exclude_exit: Option<i64>, - exclude_cwd: Option<String>, - before: Option<String>, - after: Option<String>, - limit: Option<i64>, + filter_options: OptFilters, query: &[String], db: &mut impl Database, ) -> Result<Vec<History>> { - let dir = if cwd.as_deref() == Some(".") { + let dir = if filter_options.cwd.as_deref() == Some(".") { Some(utils::get_current_dir()) } else { - cwd + filter_options.cwd }; let context = current_context(); - let before = before.and_then(|b| { - interim::parse_date_string(b.as_str(), Utc::now(), interim::Dialect::Uk) - .map_or(None, |d| Some(d.timestamp_nanos())) - }); - - let after = after.and_then(|a| { - interim::parse_date_string(a.as_str(), Utc::now(), interim::Dialect::Uk) - .map_or(None, |d| Some(d.timestamp_nanos())) - }); + let opt_filter = OptFilters { + cwd: dir, + ..filter_options + }; let results = db .search( @@ -193,45 +170,9 @@ async fn run_non_interactive( settings.filter_mode, &context, query.join(" ").as_str(), - limit, - before, - after, + opt_filter, ) .await?; - // TODO: This filtering would be better done in the SQL query, I just - // need a nice way of building queries. - let results: Vec<History> = results - .iter() - .filter(|h| { - if let Some(exit) = exit { - if h.exit != exit { - return false; - } - } - - if let Some(exit) = exclude_exit { - if h.exit == exit { - return false; - } - } - - if let Some(cwd) = &exclude_cwd { - if h.cwd.as_str() == cwd.as_str() { - return false; - } - } - - if let Some(cwd) = &dir { - if h.cwd.as_str() != cwd.as_str() { - return false; - } - } - - true - }) - .map(std::borrow::ToOwned::to_owned) - .collect(); - Ok(results) } diff --git a/src/command/client/search/engines/db.rs b/src/command/client/search/engines/db.rs index 5a35da10..b4f24561 100644 --- a/src/command/client/search/engines/db.rs +++ b/src/command/client/search/engines/db.rs @@ -1,5 +1,7 @@ use async_trait::async_trait; -use atuin_client::{database::Database, history::History, settings::SearchMode}; +use atuin_client::{ + database::Database, database::OptFilters, history::History, settings::SearchMode, +}; use eyre::Result; use super::{SearchEngine, SearchState}; @@ -19,9 +21,10 @@ impl SearchEngine for Search { state.filter_mode, &state.context, state.input.as_str(), - Some(200), - None, - None, + OptFilters { + limit: Some(200), + ..Default::default() + }, ) .await? .into_iter() diff --git a/src/command/client/search/interactive.rs b/src/command/client/search/interactive.rs index a7ee9bae..5038fc83 100644 --- a/src/command/client/search/interactive.rs +++ b/src/command/client/search/interactive.rs @@ -13,8 +13,7 @@ use semver::Version; use unicode_width::UnicodeWidthStr; use atuin_client::{ - database::current_context, - database::Database, + database::{current_context, Database}, history::History, settings::{ExitMode, FilterMode, SearchMode, Settings}, }; |
