From 6d15e54d3fe708156ed4390253739a69468775ea Mon Sep 17 00:00:00 2001 From: Abraham Toriz Date: Wed, 11 Aug 2021 20:25:32 -0500 Subject: [PATCH] implement archive command --- src/commands/archive.rs | 42 ++++++++++++++++++++++++++++++++++++----- src/main.rs | 1 + 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/commands/archive.rs b/src/commands/archive.rs index 7abcf9e..636b027 100644 --- a/src/commands/archive.rs +++ b/src/commands/archive.rs @@ -5,15 +5,15 @@ use clap::ArgMatches; use chrono::{DateTime, Utc}; use regex::Regex; -use crate::database::{Database, DBVersion}; +use crate::database::Database; use crate::error::{Error, Result}; use crate::commands::Command; use crate::config::Config; use crate::timeparse::parse_time; -use crate::old::{entries_or_warning, time_or_warning, warn_if_needed}; +use crate::old::{entries_or_warning, time_or_warning}; use crate::formatters::text; -use crate::editor; use crate::regex::parse_regex; +use crate::interactive::ask; #[derive(Default)] pub struct Args { @@ -43,12 +43,44 @@ pub struct ArchiveCommand {} impl<'a> Command<'a> for ArchiveCommand { type Args = Args; - fn handle(args: Args, db: &mut D, out: &mut O, err: &mut E, config: &Config, now: DateTime) -> Result<()> + fn handle(args: Args, db: &mut D, out: &mut O, _err: &mut E, _config: &Config, now: DateTime) -> Result<()> where D: Database, O: Write, E: Write, { - unimplemented!() + let mut entries = { + let start = args.start.map(|s| time_or_warning(s, db)).transpose()?.map(|s| s.0); + let end = args.end.map(|e| time_or_warning(e, db)).transpose()?.map(|e| e.0); + let current_sheet = db.current_sheet()?.unwrap_or_else(|| "default".into()); + let sheet = args.sheet.unwrap_or(current_sheet); + + db.entries_by_sheet(&sheet, start, end)? + }; + + if let Some(re) = args.grep { + entries.retain(|e| re.is_match(&e.note.clone().unwrap_or_else(String::new))); + } + + if args.fake { + let (entries, _) = entries_or_warning(entries, db)?; + + text::print_formatted( + entries, + out, + now, + true, + )?; + } else { + if ask(out, &format!("Archive {} entries?", entries.len()))? { + for entry in entries { + db.entry_update(entry.id, entry.start, entry.end, entry.note, &format!("_{}", entry.sheet))?; + } + } else { + writeln!(out, "Ok, they're still there")?; + } + } + + Ok(()) } } diff --git a/src/main.rs b/src/main.rs index 8d69cfa..3ce77d8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -118,6 +118,7 @@ fn main() { .arg(start_arg.clone()) .arg(end_arg.clone()) .arg(grep_arg.clone()) + .arg(sheet_arg.clone().help("Archive entries from this sheet instead of the current one")) .arg(Arg::with_name("fake") .short("f").long("fake") .help("Don't actually archive the entries, just display them")