aboutsummaryrefslogtreecommitdiffstats
path: root/src/command/client/search.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/command/client/search.rs')
-rw-r--r--src/command/client/search.rs189
1 files changed, 0 insertions, 189 deletions
diff --git a/src/command/client/search.rs b/src/command/client/search.rs
deleted file mode 100644
index 356ae251..00000000
--- a/src/command/client/search.rs
+++ /dev/null
@@ -1,189 +0,0 @@
-use atuin_common::utils;
-use clap::Parser;
-use eyre::Result;
-
-use atuin_client::{
- database::Database,
- database::{current_context, OptFilters},
- history::History,
- settings::{FilterMode, SearchMode, Settings},
-};
-
-use super::history::ListMode;
-
-mod cursor;
-mod duration;
-mod engines;
-mod history_list;
-mod interactive;
-pub use duration::{format_duration, format_duration_into};
-
-#[allow(clippy::struct_excessive_bools)]
-#[derive(Parser)]
-pub struct Cmd {
- /// Filter search result by directory
- #[arg(long, short)]
- cwd: Option<String>,
-
- /// Exclude directory from results
- #[arg(long = "exclude-cwd")]
- exclude_cwd: Option<String>,
-
- /// Filter search result by exit code
- #[arg(long, short)]
- exit: Option<i64>,
-
- /// Exclude results with this exit code
- #[arg(long = "exclude-exit")]
- exclude_exit: Option<i64>,
-
- /// Only include results added before this date
- #[arg(long, short)]
- before: Option<String>,
-
- /// Only include results after this date
- #[arg(long)]
- after: Option<String>,
-
- /// How many entries to return at most
- #[arg(long)]
- limit: Option<i64>,
-
- /// Offset from the start of the results
- #[arg(long)]
- offset: Option<i64>,
-
- /// Open interactive search UI
- #[arg(long, short)]
- interactive: bool,
-
- /// Allow overriding filter mode over config
- #[arg(long = "filter-mode")]
- filter_mode: Option<FilterMode>,
-
- /// Allow overriding search mode over config
- #[arg(long = "search-mode")]
- search_mode: Option<SearchMode>,
-
- /// Marker argument used to inform atuin that it was invoked from a shell up-key binding (hidden from help to avoid confusion)
- #[arg(long = "shell-up-key-binding", hide = true)]
- shell_up_key_binding: bool,
-
- /// Use human-readable formatting for time
- #[arg(long)]
- human: bool,
-
- query: Vec<String>,
-
- /// Show only the text of the command
- #[arg(long)]
- cmd_only: bool,
-
- /// Delete anything matching this query. Will not print out the match
- #[arg(long)]
- delete: bool,
-
- /// Reverse the order of results, oldest first
- #[arg(long, short)]
- reverse: bool,
-
- /// Available variables: {command}, {directory}, {duration}, {user}, {host}, {time}, {exit} and
- /// {relativetime}.
- /// Example: --format "{time} - [{duration}] - {directory}$\t{command}"
- #[arg(long, short)]
- format: Option<String>,
-}
-
-impl Cmd {
- pub async fn run(self, mut db: impl Database, settings: &mut Settings) -> Result<()> {
- if self.search_mode.is_some() {
- settings.search_mode = self.search_mode.unwrap();
- }
- if self.filter_mode.is_some() {
- settings.filter_mode = self.filter_mode.unwrap();
- }
-
- settings.shell_up_key_binding = self.shell_up_key_binding;
-
- if self.interactive {
- let item = interactive::history(&self.query, settings, db).await?;
- eprintln!("{item}");
- } else {
- let list_mode = ListMode::from_flags(self.human, self.cmd_only);
-
- 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,
- offset: self.offset,
- reverse: self.reverse,
- };
-
- let mut entries =
- run_non_interactive(settings, opt_filter.clone(), &self.query, &mut db).await?;
-
- if entries.is_empty() {
- std::process::exit(1)
- }
-
- // if we aren't deleting, print it all
- if self.delete {
- // delete it
- // it only took me _years_ to add this
- // sorry
- while !entries.is_empty() {
- for entry in &entries {
- eprintln!("deleting {}", entry.id);
- db.delete(entry.clone()).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());
- }
- };
- Ok(())
- }
-}
-
-// This is supposed to more-or-less mirror the command line version, so ofc
-// it is going to have a lot of args
-#[allow(clippy::too_many_arguments)]
-async fn run_non_interactive(
- settings: &Settings,
- filter_options: OptFilters,
- query: &[String],
- db: &mut impl Database,
-) -> Result<Vec<History>> {
- let dir = if filter_options.cwd.as_deref() == Some(".") {
- Some(utils::get_current_dir())
- } else {
- filter_options.cwd
- };
-
- let context = current_context();
-
- let opt_filter = OptFilters {
- cwd: dir,
- ..filter_options
- };
-
- let results = db
- .search(
- settings.search_mode,
- settings.filter_mode,
- &context,
- query.join(" ").as_str(),
- opt_filter,
- )
- .await?;
-
- Ok(results)
-}