use crate::runtime::Valence;
use std::future::Future;
use std::pin::Pin;
pub type DeleteSideEffectDispatchFn =
fn(Valence, serde_json::Value) -> Pin<Box<dyn Future<Output = ()> + Send + 'static>>;
#[derive(Copy, Clone)]
pub struct DeleteSideEffectDescriptor {
pub table_name: &'static str,
pub dispatch: DeleteSideEffectDispatchFn,
}
inventory::collect!(DeleteSideEffectDescriptor);
#[must_use]
pub fn delete_side_effect_descriptors() -> Vec<&'static DeleteSideEffectDescriptor> {
inventory::iter::<DeleteSideEffectDescriptor>
.into_iter()
.collect()
}
#[must_use]
pub fn find_delete_side_effect_descriptor(
table_name: &str,
) -> Option<&'static DeleteSideEffectDescriptor> {
delete_side_effect_descriptors()
.into_iter()
.find(|d| d.table_name == table_name)
}
pub async fn dispatch_queued_delete_side_effects(
table: &str,
before_json: serde_json::Value,
valence: &Valence,
) {
let Some(desc) = find_delete_side_effect_descriptor(table) else {
return;
};
(desc.dispatch)(valence.clone(), before_json).await;
}