Skip to main content

ops_rs/trigger/
mod.rs

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}