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