use std::ops::{Deref, DerefMut};
use chrono::Utc;
use eyre::{Result, eyre};
use crate::{Task, Vault};
pub struct TaskGuard<'a> {
task_id: u32,
vault: &'a mut Vault,
}
impl<'a> TaskGuard<'a> {
pub fn new(task_id: u32, vault: &'a mut Vault) -> Result<Self> {
if !vault.tasks.contains_key(&task_id) {
return Err(eyre!("Task not found"));
}
Ok(Self {
task_id,
vault,
})
}
}
impl Deref for TaskGuard<'_> {
type Target = Task;
fn deref(&self) -> &Self::Target {
&self.vault.tasks[&self.task_id]
}
}
impl DerefMut for TaskGuard<'_> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.vault.tasks.get_mut(&self.task_id).unwrap()
}
}
impl Drop for TaskGuard<'_> {
fn drop(&mut self) {
self.vault.updated_at = Utc::now();
let _ = self.vault.save();
}
}