ironflow_engine/executor/
decision.rs1use std::sync::Arc;
8use std::time::Instant;
9
10use ironflow_core::decision::{DecisionOutput, DecisionProvider};
11use ironflow_core::error::OperationError;
12use rust_decimal::Decimal;
13
14use crate::config::DecisionConfig;
15use crate::error::EngineError;
16
17#[derive(Debug, Clone)]
19pub struct DecisionExecution {
20 pub output: DecisionOutput,
22 pub duration_ms: u64,
24 pub cost_usd: Decimal,
26 pub input_tokens: u64,
28 pub output_tokens: u64,
30}
31
32pub async fn execute_decision(
39 provider: &Arc<dyn DecisionProvider>,
40 config: &DecisionConfig,
41) -> Result<DecisionExecution, EngineError> {
42 let request = config.to_request();
43 let start = Instant::now();
44 let output = provider
45 .decide(&request)
46 .await
47 .map_err(OperationError::from)?;
48 let duration_ms = start.elapsed().as_millis() as u64;
49 let input_tokens = output.usage.input_tokens;
50 let output_tokens = output.usage.output_tokens;
51 Ok(DecisionExecution {
52 cost_usd: output.usage.cost_usd(),
53 output,
54 duration_ms,
55 input_tokens,
56 output_tokens,
57 })
58}