use scylla::client::caching_session::CachingSession;
use scylla::serialize::row::SerializeRow;
use crate::errors::CharybdisError;
use crate::model::Model;
use crate::query::QueryValue;
pub trait Callbacks: Model + 'static
where
Self: 'static,
{
type Extension;
type Error: From<CharybdisError>;
async fn before_insert(
&mut self,
_session: &CachingSession,
_extension: &Self::Extension,
) -> Result<(), Self::Error> {
Ok(())
}
async fn after_insert(
&mut self,
_session: &CachingSession,
_extension: &Self::Extension,
) -> Result<(), Self::Error> {
Ok(())
}
async fn before_update(
&mut self,
_session: &CachingSession,
_extension: &Self::Extension,
) -> Result<(), Self::Error> {
Ok(())
}
async fn after_update(
&mut self,
_session: &CachingSession,
_extension: &Self::Extension,
) -> Result<(), Self::Error> {
Ok(())
}
async fn before_delete(
&mut self,
_session: &CachingSession,
_extension: &Self::Extension,
) -> Result<(), Self::Error> {
Ok(())
}
async fn after_delete(
&mut self,
_session: &CachingSession,
_extension: &Self::Extension,
) -> Result<(), Self::Error> {
Ok(())
}
}
pub struct InsertAction<M: Callbacks>(M);
pub struct UpdateAction<M: Callbacks>(M);
pub struct DeleteAction<M: Callbacks>(M);
pub trait CallbackAction<M: Callbacks> {
fn query_value<Val: SerializeRow>(model: &M) -> QueryValue<'_, Val, M>;
async fn before_execute(model: &mut M, session: &CachingSession, extension: &M::Extension) -> Result<(), M::Error>;
async fn after_execute(model: &mut M, session: &CachingSession, extension: &M::Extension) -> Result<(), M::Error>;
}
impl<M: Callbacks> CallbackAction<M> for InsertAction<M> {
fn query_value<Val: SerializeRow>(model: &'_ M) -> QueryValue<'_, Val, M> {
QueryValue::Model(model)
}
async fn before_execute(model: &mut M, session: &CachingSession, extension: &M::Extension) -> Result<(), M::Error> {
model.before_insert(session, extension).await
}
async fn after_execute(model: &mut M, session: &CachingSession, extension: &M::Extension) -> Result<(), M::Error> {
model.after_insert(session, extension).await
}
}
impl<M: Callbacks> CallbackAction<M> for UpdateAction<M> {
fn query_value<Val: SerializeRow>(model: &'_ M) -> QueryValue<'_, Val, M> {
QueryValue::Model(model)
}
async fn before_execute(model: &mut M, session: &CachingSession, extension: &M::Extension) -> Result<(), M::Error> {
model.before_update(session, extension).await
}
async fn after_execute(model: &mut M, session: &CachingSession, extension: &M::Extension) -> Result<(), M::Error> {
model.after_update(session, extension).await
}
}
impl<M: Callbacks> CallbackAction<M> for DeleteAction<M> {
fn query_value<Val: SerializeRow>(model: &'_ M) -> QueryValue<'_, Val, M> {
QueryValue::PrimaryKey(model.primary_key_values())
}
async fn before_execute(model: &mut M, session: &CachingSession, extension: &M::Extension) -> Result<(), M::Error> {
model.before_delete(session, extension).await
}
async fn after_execute(model: &mut M, session: &CachingSession, extension: &M::Extension) -> Result<(), M::Error> {
model.after_delete(session, extension).await
}
}