use std::sync::Arc;
use std::time::Instant;
use ironflow_core::decision::{DecisionOutput, DecisionProvider};
use ironflow_core::error::OperationError;
use rust_decimal::Decimal;
use crate::config::DecisionConfig;
use crate::error::EngineError;
#[derive(Debug, Clone)]
pub struct DecisionExecution {
pub output: DecisionOutput,
pub duration_ms: u64,
pub cost_usd: Decimal,
pub input_tokens: u64,
pub output_tokens: u64,
}
pub async fn execute_decision(
provider: &Arc<dyn DecisionProvider>,
config: &DecisionConfig,
) -> Result<DecisionExecution, EngineError> {
let request = config.to_request();
let start = Instant::now();
let output = provider
.decide(&request)
.await
.map_err(OperationError::from)?;
let duration_ms = start.elapsed().as_millis() as u64;
let input_tokens = output.usage.input_tokens;
let output_tokens = output.usage.output_tokens;
Ok(DecisionExecution {
cost_usd: output.usage.cost_usd(),
output,
duration_ms,
input_tokens,
output_tokens,
})
}