1use crate::{BatchOp, DryContext, Op, OpMetadata, OpResult, WetContext};
2use async_trait::async_trait;
3use std::sync::Arc;
4
5pub mod predicates;
6pub use predicates::*;
7pub mod registry;
8pub use registry::*;
9pub mod engine;
10pub use engine::*;
11
12#[async_trait]
13pub trait Trigger: Send + Sync {
14 fn name(&self) -> String;
15
16 fn predicate(&self) -> Arc<dyn Op<bool>>;
17 fn actions(&self) -> Vec<Arc<dyn Op<()>>>;
18
19 async fn perform(&self, dry: &mut DryContext, wet: &mut WetContext) -> OpResult<()> {
20 let should = self.predicate().perform(dry, wet).await?;
21 if should {
22 let batch = BatchOp::new(self.actions());
23 batch.perform(dry, wet).await?;
24 }
25 Ok(())
26 }
27
28 fn metadata(&self) -> OpMetadata {
29 OpMetadata {
30 name: format!(
31 "Trigger {} with {} actions",
32 self.name(),
33 self.actions().len()
34 ),
35 description: None,
36 input_schema: None,
37 reference_schema: None,
38 output_schema: None,
39 }
40 }
41}
42
43#[async_trait]
44impl<T> Op<()> for T
45where
46 T: Trigger,
47{
48 async fn perform(&self, dry: &mut DryContext, wet: &mut WetContext) -> OpResult<()> {
49 self.perform(dry, wet).await
50 }
51
52 fn metadata(&self) -> OpMetadata {
53 self.metadata()
54 }
55}