use doido_core::Result;
pub trait Callbacks {
fn before_validation(&mut self) -> Result<()> {
Ok(())
}
fn before_save(&mut self) -> Result<()> {
Ok(())
}
fn after_save(&mut self) -> Result<()> {
Ok(())
}
fn before_create(&mut self) -> Result<()> {
Ok(())
}
fn after_create(&mut self) -> Result<()> {
Ok(())
}
fn before_update(&mut self) -> Result<()> {
Ok(())
}
fn after_update(&mut self) -> Result<()> {
Ok(())
}
fn before_destroy(&mut self) -> Result<()> {
Ok(())
}
fn after_destroy(&mut self) -> Result<()> {
Ok(())
}
}
pub async fn run_create<M: Callbacks>(
model: &mut M,
persist: impl AsyncFnOnce(&mut M) -> Result<()>,
) -> Result<()> {
model.before_validation()?;
model.before_save()?;
model.before_create()?;
persist(model).await?;
model.after_create()?;
model.after_save()?;
Ok(())
}
pub async fn run_update<M: Callbacks>(
model: &mut M,
persist: impl AsyncFnOnce(&mut M) -> Result<()>,
) -> Result<()> {
model.before_validation()?;
model.before_save()?;
model.before_update()?;
persist(model).await?;
model.after_update()?;
model.after_save()?;
Ok(())
}
pub async fn run_destroy<M: Callbacks>(
model: &mut M,
persist: impl AsyncFnOnce(&mut M) -> Result<()>,
) -> Result<()> {
model.before_destroy()?;
persist(model).await?;
model.after_destroy()?;
Ok(())
}