From 4a839dab444d1ceccaeca42a2c4c3594281ee22a Mon Sep 17 00:00:00 2001 From: Satyarth Sampath Date: Tue, 3 May 2022 20:19:27 +0530 Subject: [PATCH] Adds stats summary (#384) * stat command parsing is handled without subcommands * Updates match clause based on PR review Co-authored-by: Conrad Ludgate * updates value returned by match based on PR review * adds vscode to gitignore * use an if statement instead of match Co-authored-by: Satyarth Co-authored-by: Conrad Ludgate --- .gitignore | 1 + src/command/client.rs | 1 - src/command/client/stats.rs | 51 +++++++++++++------------------------ 3 files changed, 18 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 48f42de..02edf33 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ */target .env .idea/ +.vscode/ diff --git a/src/command/client.rs b/src/command/client.rs index 80316ed..c75872a 100644 --- a/src/command/client.rs +++ b/src/command/client.rs @@ -29,7 +29,6 @@ pub enum Cmd { Import(import::Cmd), /// Calculate statistics for your history - #[clap(subcommand)] Stats(stats::Cmd), /// Output shell setup diff --git a/src/command/client/stats.rs b/src/command/client/stats.rs index 5f1bab5..8045098 100644 --- a/src/command/client/stats.rs +++ b/src/command/client/stats.rs @@ -14,12 +14,9 @@ use atuin_client::{ #[derive(Parser)] #[clap(infer_subcommands = true)] -pub enum Cmd { - /// Compute statistics for all of time - All, - - /// Compute statistics for a single day - Day { words: Vec }, +pub struct Cmd { + /// compute statistics for the specified period, leave blank for statistics since the beginning + period: Vec, } fn compute_stats(history: &[History]) -> Result<()> { @@ -28,7 +25,6 @@ fn compute_stats(history: &[History]) -> Result<()> { for i in history { *commands.entry(i.command.clone()).or_default() += 1; } - let most_common_command = commands.iter().max_by(|a, b| a.1.cmp(b.1)); if most_common_command.is_none() { @@ -72,32 +68,19 @@ impl Cmd { settings: &Settings, ) -> Result<()> { let context = current_context(); - - match self { - Self::Day { words } => { - let words = if words.is_empty() { - String::from("yesterday") - } else { - words.join(" ") - }; - - let start = parse_date_string(&words, Local::now(), settings.dialect.into())?; - let end = start + Duration::days(1); - - let history = db.range(start.into(), end.into()).await?; - - compute_stats(&history)?; - - Ok(()) - } - - Self::All => { - let history = db.list(FilterMode::Global, &context, None, false).await?; - - compute_stats(&history)?; - - Ok(()) - } - } + let words = if self.period.is_empty() { + String::from("all") + } else { + self.period.join(" ") + }; + let history = if words.as_str() == "all" { + db.list(FilterMode::Global, &context, None, false).await? + } else { + let start = parse_date_string(&words, Local::now(), settings.dialect.into())?; + let end = start + Duration::days(1); + db.range(start.into(), end.into()).await? + }; + compute_stats(&history)?; + Ok(()) } }