use crate::models::{Note, Project, Resource, Task};
use anyhow::Result;
pub trait Storage {
fn load(&self) -> Result<Vec<Task>>;
fn save(&self, tasks: &[Task]) -> Result<()>;
fn load_projects(&self) -> Result<Vec<Project>>;
fn save_projects(&self, projects: &[Project]) -> Result<()>;
fn load_notes(&self) -> Result<Vec<Note>>;
fn save_notes(&self, notes: &[Note]) -> Result<()>;
fn load_resources(&self) -> Result<Vec<Resource>>;
fn save_resources(&self, resources: &[Resource]) -> Result<()>;
fn load_all(&self) -> Result<(Vec<Task>, Vec<Project>, Vec<Note>)> {
Ok((self.load()?, self.load_projects()?, self.load_notes()?))
}
#[allow(clippy::type_complexity)]
fn load_all_with_resources(
&self,
) -> Result<(Vec<Task>, Vec<Project>, Vec<Note>, Vec<Resource>)> {
Ok((
self.load()?,
self.load_projects()?,
self.load_notes()?,
self.load_resources()?,
))
}
fn save_all(&self, tasks: &[Task], projects: &[Project], notes: &[Note]) -> Result<()> {
self.save(tasks)?;
self.save_projects(projects)?;
self.save_notes(notes)
}
#[allow(dead_code)]
fn location(&self) -> String;
}
pub mod backup;
pub mod memory;
pub mod sqlite;
pub use memory::InMemoryStorage;
pub use sqlite::{SqliteStorage, get_db_path};