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