use crate::core::model::State;
use crate::core::store::Store;
use anyhow::Result;
pub struct DualStore<P: Store, S: Store> {
primary: P,
secondary: S,
}
impl<P: Store, S: Store> DualStore<P, S> {
pub fn new(primary: P, secondary: S) -> Self {
Self { primary, secondary }
}
}
impl<P: Store, S: Store> Store for DualStore<P, S> {
fn load(&self) -> Result<State> {
let state = self.primary.load()?;
let is_empty = state.short.is_empty() &&
state.medium.is_empty() &&
state.long.is_empty() &&
state.completed.is_empty();
if is_empty {
if let Ok(backup) = self.secondary.load() {
let backup_is_empty = backup.short.is_empty() &&
backup.medium.is_empty() &&
backup.long.is_empty() &&
backup.completed.is_empty();
if !backup_is_empty {
return Ok(backup);
}
}
}
Ok(state)
}
fn save(&self, state: &State) -> Result<()> {
self.primary.save(state)?;
let _ = self.secondary.save(state);
Ok(())
}
}