lash_core/tool_provider/
triggers.rs1use 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}