Adds stats summary (#384)

* stat command parsing is handled without subcommands

* Updates match clause based on PR review

Co-authored-by: Conrad Ludgate <oon@conradludgate.com>

* updates value returned by match based on PR review

* adds vscode to gitignore

* use an if statement instead of match

Co-authored-by: Satyarth <satyarth.sampath@gojek.com>
Co-authored-by: Conrad Ludgate <oon@conradludgate.com>
This commit is contained in:
Satyarth Sampath 2022-05-03 20:19:27 +05:30 committed by GitHub
parent 7a394b0115
commit 4a839dab44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 35 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
*/target
.env
.idea/
.vscode/

View File

@ -29,7 +29,6 @@ pub enum Cmd {
Import(import::Cmd),
/// Calculate statistics for your history
#[clap(subcommand)]
Stats(stats::Cmd),
/// Output shell setup

View File

@ -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<String> },
pub struct Cmd {
/// compute statistics for the specified period, leave blank for statistics since the beginning
period: Vec<String>,
}
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(())
}
}