wfe_core/primitives/
decide.rs1use async_trait::async_trait;
2
3use crate::models::ExecutionResult;
4use crate::traits::step::{StepBody, StepExecutionContext};
5
6#[derive(Default)]
8pub struct DecideStep {
9 pub expression_value: serde_json::Value,
10}
11
12#[async_trait]
13impl StepBody for DecideStep {
14 async fn run(&mut self, _context: &StepExecutionContext<'_>) -> crate::Result<ExecutionResult> {
15 Ok(ExecutionResult::outcome(self.expression_value.clone()))
16 }
17}
18
19#[cfg(test)]
20mod tests {
21 use super::*;
22 use crate::models::ExecutionPointer;
23 use crate::primitives::test_helpers::*;
24 use serde_json::json;
25
26 #[tokio::test]
27 async fn returns_correct_outcome_value() {
28 let mut step = DecideStep {
29 expression_value: json!("route_a"),
30 };
31 let pointer = ExecutionPointer::new(0);
32 let wf_step = default_step();
33 let workflow = default_workflow();
34 let ctx = make_context(&pointer, &wf_step, &workflow);
35
36 let result = step.run(&ctx).await.unwrap();
37 assert!(result.proceed);
38 assert_eq!(result.outcome_value, Some(json!("route_a")));
39 }
40
41 #[tokio::test]
42 async fn returns_numeric_outcome() {
43 let mut step = DecideStep {
44 expression_value: json!(42),
45 };
46 let pointer = ExecutionPointer::new(0);
47 let wf_step = default_step();
48 let workflow = default_workflow();
49 let ctx = make_context(&pointer, &wf_step, &workflow);
50
51 let result = step.run(&ctx).await.unwrap();
52 assert!(result.proceed);
53 assert_eq!(result.outcome_value, Some(json!(42)));
54 }
55}