Support marking multiple tasks as done

Not yet exposed via the CLI though
This commit is contained in:
Joscha 2021-12-16 00:47:59 +01:00
parent c07d27aa13
commit ab63261dfd
5 changed files with 32 additions and 25 deletions

View file

@ -1,24 +1,36 @@
use std::vec;
use chrono::NaiveDateTime;
use crate::eval::Entry;
use crate::files::commands::Done;
use crate::files::Files;
use super::error::Result;
use super::error::{Error, Result};
use super::layout::line::LineLayout;
pub fn mark_done(
files: &mut Files,
entries: &[Entry],
layout: &LineLayout,
number: usize,
numbers: &[usize],
now: NaiveDateTime,
) -> Result<()> {
let entry = &entries[layout.look_up_number(number)?];
let done = Done {
date: entry.dates.map(|dates| dates.into()),
done_at: now.date(),
};
files.add_done(number, entry.source, done)?;
Ok(())
let mut not_tasks = vec![];
for &number in numbers {
let entry = &entries[layout.look_up_number(number)?];
let done = Done {
date: entry.dates.map(|dates| dates.into()),
done_at: now.date(),
};
if !files.add_done(entry.source, done) {
not_tasks.push(number);
}
}
if not_tasks.is_empty() {
Ok(())
} else {
Err(Error::NotATask(not_tasks))
}
}

View file

@ -12,6 +12,8 @@ pub enum Error {
NoNumber,
#[error("No entry with number {0}")]
NoSuchEntry(usize),
#[error("Not a task")]
NotATask(Vec<usize>),
}
pub type Result<T> = result::Result<T, Error>;