Skip to main content

lash_core/tool_provider/
triggers.rs

1use crate::{PluginError, TriggerEmitReport, TriggerOccurrenceRequest};
2
3use super::ToolContext;
4
5#[derive(Clone)]
6pub struct ToolTriggerClient<'run> {
7    pub(super) context: ToolContext<'run>,
8}
9
10impl<'run> ToolTriggerClient<'run> {
11    pub async fn emit(
12        &self,
13        request: TriggerOccurrenceRequest,
14    ) -> Result<TriggerEmitReport, PluginError> {
15        let Some(dispatch) = self.context.runtime_dispatch.clone() else {
16            return Err(PluginError::Session(
17                "trigger emission is unavailable outside runtime tool execution".to_string(),
18            ));
19        };
20        let router = dispatch.trigger_router.as_ref().ok_or_else(|| {
21            PluginError::Session("trigger store is unavailable in this runtime".to_string())
22        })?;
23        let outcome = request.clone();
24        let report = router
25            .emit(request, dispatch.effect_controller.controller())
26            .await?;
27        dispatch
28            .trigger_outcomes
29            .enqueue(crate::tool_dispatch::ToolTriggerEffectOutcome {
30                source_type: outcome.source_type,
31                source_key: outcome.source_key,
32                occurrence_id: report.occurrence_id.clone(),
33                payload: outcome.payload,
34                idempotency_key: outcome.idempotency_key,
35                source: outcome.source,
36                started_process_ids: report.started_process_ids.clone(),
37            })
38            .map_err(PluginError::Session)?;
39        Ok(report)
40    }
41}