xerv_nodes/triggers/
mod.rs

1//! Trigger implementations for XERV.
2//!
3//! Triggers are entry points that inject events into a flow.
4//! This module provides the standard library triggers:
5//!
6//! - [`WebhookTrigger`] - HTTP webhook endpoint
7//! - [`CronTrigger`] - Scheduled execution via cron expressions
8//! - [`FilesystemTrigger`] - File system event watcher
9//! - [`QueueTrigger`] - In-memory message queue
10//! - [`MemoryTrigger`] - Direct memory injection (for benchmarks)
11//! - [`ManualTrigger`] - Manual invocation (for testing)
12//! - [`KafkaTrigger`] - Kafka consumer (requires `kafka` feature)
13
14mod cron;
15mod filesystem;
16mod kafka;
17mod manual;
18mod memory;
19mod queue;
20mod webhook;
21
22pub use self::cron::CronTrigger;
23pub use filesystem::FilesystemTrigger;
24pub use kafka::KafkaTrigger;
25pub use manual::{ManualEvent, ManualFireHandle, ManualTrigger};
26pub use memory::{MemoryInjector, MemoryTrigger};
27pub use queue::{QueueHandle, QueueMessage, QueueTrigger};
28pub use webhook::WebhookTrigger;
29
30use xerv_core::error::Result;
31use xerv_core::traits::{Trigger, TriggerConfig, TriggerFactory, TriggerType};
32
33/// Standard trigger factory that creates all built-in triggers.
34pub struct StandardTriggerFactory;
35
36impl StandardTriggerFactory {
37    /// Create a new standard trigger factory.
38    pub fn new() -> Self {
39        Self
40    }
41
42    /// Create a trigger from configuration.
43    pub fn create_trigger(config: &TriggerConfig) -> Result<Box<dyn Trigger>> {
44        match config.trigger_type {
45            TriggerType::Webhook => Ok(Box::new(WebhookTrigger::from_config(config)?)),
46            TriggerType::Cron => Ok(Box::new(CronTrigger::from_config(config)?)),
47            TriggerType::Filesystem => Ok(Box::new(FilesystemTrigger::from_config(config)?)),
48            TriggerType::Queue => Ok(Box::new(QueueTrigger::from_config(config)?)),
49            TriggerType::Memory => Ok(Box::new(MemoryTrigger::from_config(config)?)),
50            TriggerType::Manual => Ok(Box::new(ManualTrigger::from_config(config)?)),
51            TriggerType::Kafka => Ok(Box::new(KafkaTrigger::from_config(config)?)),
52        }
53    }
54}
55
56impl Default for StandardTriggerFactory {
57    fn default() -> Self {
58        Self::new()
59    }
60}
61
62/// Factory for webhook triggers.
63pub struct WebhookTriggerFactory;
64
65impl TriggerFactory for WebhookTriggerFactory {
66    fn trigger_type(&self) -> TriggerType {
67        TriggerType::Webhook
68    }
69
70    fn create(&self, config: &TriggerConfig) -> Result<Box<dyn Trigger>> {
71        Ok(Box::new(WebhookTrigger::from_config(config)?))
72    }
73}
74
75/// Factory for cron triggers.
76pub struct CronTriggerFactory;
77
78impl TriggerFactory for CronTriggerFactory {
79    fn trigger_type(&self) -> TriggerType {
80        TriggerType::Cron
81    }
82
83    fn create(&self, config: &TriggerConfig) -> Result<Box<dyn Trigger>> {
84        Ok(Box::new(CronTrigger::from_config(config)?))
85    }
86}
87
88/// Factory for filesystem triggers.
89pub struct FilesystemTriggerFactory;
90
91impl TriggerFactory for FilesystemTriggerFactory {
92    fn trigger_type(&self) -> TriggerType {
93        TriggerType::Filesystem
94    }
95
96    fn create(&self, config: &TriggerConfig) -> Result<Box<dyn Trigger>> {
97        Ok(Box::new(FilesystemTrigger::from_config(config)?))
98    }
99}
100
101/// Factory for queue triggers.
102pub struct QueueTriggerFactory;
103
104impl TriggerFactory for QueueTriggerFactory {
105    fn trigger_type(&self) -> TriggerType {
106        TriggerType::Queue
107    }
108
109    fn create(&self, config: &TriggerConfig) -> Result<Box<dyn Trigger>> {
110        Ok(Box::new(QueueTrigger::from_config(config)?))
111    }
112}
113
114/// Factory for memory triggers.
115pub struct MemoryTriggerFactory;
116
117impl TriggerFactory for MemoryTriggerFactory {
118    fn trigger_type(&self) -> TriggerType {
119        TriggerType::Memory
120    }
121
122    fn create(&self, config: &TriggerConfig) -> Result<Box<dyn Trigger>> {
123        Ok(Box::new(MemoryTrigger::from_config(config)?))
124    }
125}
126
127/// Factory for manual triggers.
128pub struct ManualTriggerFactory;
129
130impl TriggerFactory for ManualTriggerFactory {
131    fn trigger_type(&self) -> TriggerType {
132        TriggerType::Manual
133    }
134
135    fn create(&self, config: &TriggerConfig) -> Result<Box<dyn Trigger>> {
136        Ok(Box::new(ManualTrigger::from_config(config)?))
137    }
138}
139
140/// Factory for Kafka triggers.
141pub struct KafkaTriggerFactory;
142
143impl TriggerFactory for KafkaTriggerFactory {
144    fn trigger_type(&self) -> TriggerType {
145        TriggerType::Kafka
146    }
147
148    fn create(&self, config: &TriggerConfig) -> Result<Box<dyn Trigger>> {
149        Ok(Box::new(KafkaTrigger::from_config(config)?))
150    }
151}