Skip to main content

wfe_core/primitives/
decide.rs

1use async_trait::async_trait;
2
3use crate::models::ExecutionResult;
4use crate::traits::step::{StepBody, StepExecutionContext};
5
6/// A decision step that returns an outcome value for routing.
7#[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}