dataflow_rs/engine/
task.rs

1use crate::engine::message::Message;
2use datalogic_rs::{arena::DataArena, DataValue};
3use serde::Deserialize;
4use serde_json::Value;
5
6use super::message::Change;
7// Task configuration struct - represents task definition in workflow configuration
8#[derive(Deserialize, Clone, Debug)]
9pub struct Task {
10    pub id: String,
11    pub name: String,
12    pub description: Option<String>,
13    pub condition: Option<Value>,
14    pub function: String,
15    pub input: Value,
16}
17
18impl Task {
19    pub fn builder() -> TaskBuilder {
20        TaskBuilder::new()
21    }
22}
23
24// Task Builder for programmatic task creation
25pub struct TaskBuilder {
26    id: Option<String>,
27    name: Option<String>,
28    description: Option<String>,
29    condition: Option<Value>,
30    function: Option<String>,
31    input: Value,
32}
33
34impl Default for TaskBuilder {
35    fn default() -> Self {
36        Self::new()
37    }
38}
39
40impl TaskBuilder {
41    pub fn new() -> Self {
42        Self {
43            id: None,
44            name: None,
45            description: None,
46            condition: None,
47            function: None,
48            input: serde_json::json!({}),
49        }
50    }
51
52    pub fn id(mut self, id: impl Into<String>) -> Self {
53        self.id = Some(id.into());
54        self
55    }
56
57    pub fn name(mut self, name: impl Into<String>) -> Self {
58        self.name = Some(name.into());
59        self
60    }
61
62    pub fn description(mut self, description: impl Into<String>) -> Self {
63        self.description = Some(description.into());
64        self
65    }
66
67    pub fn condition(mut self, condition: Value) -> Self {
68        self.condition = Some(condition);
69        self
70    }
71
72    pub fn function(mut self, function: impl Into<String>) -> Self {
73        self.function = Some(function.into());
74        self
75    }
76
77    pub fn input(mut self, input: Value) -> Self {
78        self.input = input;
79        self
80    }
81
82    pub fn build(self) -> Task {
83        Task {
84            id: self.id.expect("Task ID is required"),
85            name: self.name.expect("Task name is required"),
86            description: self.description,
87            condition: self.condition,
88            function: self.function.expect("Task function is required"),
89            input: self.input,
90        }
91    }
92}
93
94// Task trait for implementing custom task behaviors
95pub trait FunctionHandler {
96    fn execute<'a>(
97        &self,
98        message: &mut Message<'a>,
99        input: &DataValue,
100        arena: &'a DataArena,
101    ) -> Result<Vec<Change<'a>>, String>;
102}