dataflow_rs/engine/
task.rs1use crate::engine::message::Message;
2use datalogic_rs::{arena::DataArena, DataValue};
3use serde::Deserialize;
4use serde_json::Value;
5
6use super::message::Change;
7#[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
24pub 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
94pub 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}