use crate::error::ReminderError;
use crate::types::{Reminder, ReminderFilter};
pub fn same_reminder(a: &Reminder, b: &Reminder) -> bool {
match (serde_json::to_value(a), serde_json::to_value(b)) {
(Ok(a), Ok(b)) => a == b,
_ => false,
}
}
pub trait ReminderStore: Send + Sync {
fn save(&self, _reminder: &Reminder) -> Result<(), ReminderError> {
Err(ReminderError::Store(
"reminder storage not supported".into(),
))
}
fn get(&self, _id: &str) -> Result<Option<Reminder>, ReminderError> {
Err(ReminderError::Store(
"reminder storage not supported".into(),
))
}
fn update(&self, _reminder: &Reminder) -> Result<(), ReminderError> {
Err(ReminderError::Store(
"reminder storage not supported".into(),
))
}
fn update_if_unchanged(
&self,
expected: &Reminder,
new: &Reminder,
) -> Result<bool, ReminderError> {
match self.get(&expected.id)? {
Some(current) if same_reminder(¤t, expected) => {
self.update(new)?;
Ok(true)
}
Some(_) => Ok(false),
None => Err(ReminderError::NotFound(expected.id.clone())),
}
}
fn delete(&self, _id: &str) -> Result<bool, ReminderError> {
Err(ReminderError::Store(
"reminder storage not supported".into(),
))
}
fn list(&self, _filter: &ReminderFilter) -> Result<Vec<Reminder>, ReminderError> {
Err(ReminderError::Store(
"reminder storage not supported".into(),
))
}
}