use crate::error::Result;
use crate::validation::Validate;
pub trait Callbacks: Sized {
fn before_validation(&mut self) -> Result<()> {
Ok(())
}
fn after_validation(&self) -> Result<()> {
Ok(())
}
fn before_save(&mut self) -> Result<()> {
Ok(())
}
fn after_save(&self) -> Result<()> {
Ok(())
}
fn before_create(&mut self) -> Result<()> {
Ok(())
}
fn after_create(&self) -> Result<()> {
Ok(())
}
fn before_update(&mut self) -> Result<()> {
Ok(())
}
fn after_update(&self) -> Result<()> {
Ok(())
}
fn before_delete(&self) -> Result<()> {
Ok(())
}
fn after_delete(&self) -> Result<()> {
Ok(())
}
}
pub trait CallbackRunner: Callbacks {
fn run_create_callbacks(&mut self) -> Result<()>
where
Self: Validate,
{
self.before_validation()?;
Validate::validate(self).map_err(crate::Error::from)?;
self.after_validation()?;
self.before_save()?;
self.before_create()?;
Ok(())
}
fn run_after_create_callbacks(&self) -> Result<()> {
self.after_create()?;
self.after_save()?;
Ok(())
}
fn run_update_callbacks(&mut self) -> Result<()>
where
Self: Validate,
{
self.before_validation()?;
Validate::validate(self).map_err(crate::Error::from)?;
self.after_validation()?;
self.before_save()?;
self.before_update()?;
Ok(())
}
fn run_after_update_callbacks(&self) -> Result<()> {
self.after_update()?;
self.after_save()?;
Ok(())
}
fn run_delete_callbacks(&self) -> Result<()> {
self.before_delete()?;
Ok(())
}
fn run_after_delete_callbacks(&self) -> Result<()> {
self.after_delete()?;
Ok(())
}
}
impl<T: Callbacks> CallbackRunner for T {}
#[doc(hidden)]
pub trait BeforeCreateDispatch<T> {
fn run_before_create(self) -> Result<()>;
}
impl<T: CallbackRunner + Validate> BeforeCreateDispatch<T> for &mut T {
fn run_before_create(self) -> Result<()> {
self.run_create_callbacks()
}
}
impl<T> BeforeCreateDispatch<T> for &&mut T {
fn run_before_create(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait AfterCreateDispatch<T> {
fn run_after_create(self) -> Result<()>;
}
impl<T: CallbackRunner> AfterCreateDispatch<T> for &T {
fn run_after_create(self) -> Result<()> {
self.run_after_create_callbacks()
}
}
impl<T> AfterCreateDispatch<T> for &&T {
fn run_after_create(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait BeforeValidationDispatch<T> {
fn run_before_validation(self) -> Result<()>;
}
impl<T: Callbacks> BeforeValidationDispatch<T> for &mut T {
fn run_before_validation(self) -> Result<()> {
self.before_validation()
}
}
impl<T> BeforeValidationDispatch<T> for &&mut T {
fn run_before_validation(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait AfterValidationDispatch<T> {
fn run_after_validation(self) -> Result<()>;
}
impl<T: Callbacks> AfterValidationDispatch<T> for &T {
fn run_after_validation(self) -> Result<()> {
self.after_validation()
}
}
impl<T> AfterValidationDispatch<T> for &&T {
fn run_after_validation(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait BeforeSaveDispatch<T> {
fn run_before_save(self) -> Result<()>;
}
impl<T: Callbacks> BeforeSaveDispatch<T> for &mut T {
fn run_before_save(self) -> Result<()> {
self.before_save()
}
}
impl<T> BeforeSaveDispatch<T> for &&mut T {
fn run_before_save(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait BeforeCreateOnlyDispatch<T> {
fn run_before_create_only(self) -> Result<()>;
}
impl<T: Callbacks> BeforeCreateOnlyDispatch<T> for &mut T {
fn run_before_create_only(self) -> Result<()> {
self.before_create()
}
}
impl<T> BeforeCreateOnlyDispatch<T> for &&mut T {
fn run_before_create_only(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait BeforeUpdateDispatch<T> {
fn run_before_update(self) -> Result<()>;
}
impl<T: CallbackRunner + Validate> BeforeUpdateDispatch<T> for &mut T {
fn run_before_update(self) -> Result<()> {
self.run_update_callbacks()
}
}
impl<T> BeforeUpdateDispatch<T> for &&mut T {
fn run_before_update(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait BeforeUpdateOnlyDispatch<T> {
fn run_before_update_only(self) -> Result<()>;
}
impl<T: Callbacks> BeforeUpdateOnlyDispatch<T> for &mut T {
fn run_before_update_only(self) -> Result<()> {
self.before_update()
}
}
impl<T> BeforeUpdateOnlyDispatch<T> for &&mut T {
fn run_before_update_only(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait AfterUpdateDispatch<T> {
fn run_after_update(self) -> Result<()>;
}
impl<T: CallbackRunner> AfterUpdateDispatch<T> for &T {
fn run_after_update(self) -> Result<()> {
self.run_after_update_callbacks()
}
}
impl<T> AfterUpdateDispatch<T> for &&T {
fn run_after_update(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait BeforeDeleteDispatch<T> {
fn run_before_delete(self) -> Result<()>;
}
impl<T: CallbackRunner> BeforeDeleteDispatch<T> for &T {
fn run_before_delete(self) -> Result<()> {
self.run_delete_callbacks()
}
}
impl<T> BeforeDeleteDispatch<T> for &&T {
fn run_before_delete(self) -> Result<()> {
Ok(())
}
}
#[doc(hidden)]
pub trait AfterDeleteDispatch<T> {
fn run_after_delete(self) -> Result<()>;
}
impl<T: CallbackRunner> AfterDeleteDispatch<T> for &T {
fn run_after_delete(self) -> Result<()> {
self.run_after_delete_callbacks()
}
}
impl<T> AfterDeleteDispatch<T> for &&T {
fn run_after_delete(self) -> Result<()> {
Ok(())
}
}
#[cfg(test)]
#[path = "testing/callbacks_tests.rs"]
mod tests;