implement archive command

This commit is contained in:
Abraham Toriz 2021-08-11 20:25:32 -05:00
parent 1365d6d466
commit 6d15e54d3f
2 changed files with 38 additions and 5 deletions

View File

@ -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<D, O, E>(args: Args, db: &mut D, out: &mut O, err: &mut E, config: &Config, now: DateTime<Utc>) -> Result<()>
fn handle<D, O, E>(args: Args, db: &mut D, out: &mut O, _err: &mut E, _config: &Config, now: DateTime<Utc>) -> 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(())
}
}

View File

@ -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")