Skip to main content

zen_engine/nodes/function/
mod.rs

1pub mod http_handler;
2pub(crate) mod v1;
3pub(crate) mod v2;
4
5use crate::nodes::definition::NodeHandler;
6use crate::nodes::function::v1::{FunctionV1NodeHandler, FunctionV1Trace};
7use crate::nodes::function::v2::{FunctionV2NodeHandler, FunctionV2Trace};
8use crate::nodes::result::NodeResult;
9use crate::nodes::NodeContext;
10use std::sync::Arc;
11use zen_types::decision::{FunctionContent, FunctionNodeContent};
12use zen_types::variable::Variable;
13
14#[derive(Debug, Clone)]
15pub struct FunctionNodeHandler;
16
17pub type FunctionNodeData = FunctionNodeContent;
18
19pub type FunctionNodeTrace = Variable;
20
21impl NodeHandler for FunctionNodeHandler {
22    type NodeData = FunctionNodeData;
23    type TraceData = FunctionNodeTrace;
24
25    async fn handle(&self, ctx: NodeContext<Self::NodeData, Self::TraceData>) -> NodeResult {
26        match &ctx.node {
27            FunctionNodeContent::Version1(source) => {
28                let v1_context = NodeContext::<Arc<str>, FunctionV1Trace> {
29                    id: ctx.id.clone(),
30                    name: ctx.name.clone(),
31                    input: ctx.input.clone(),
32                    nodes: ctx.nodes.clone(),
33                    extensions: ctx.extensions.clone(),
34                    trace: ctx.config.trace.then(|| Default::default()),
35                    iteration: ctx.iteration,
36                    config: ctx.config,
37                    node: source.clone(),
38                };
39
40                FunctionV1NodeHandler.handle(v1_context).await
41            }
42            FunctionNodeContent::Version2(content) => {
43                let v2_context = NodeContext::<FunctionContent, FunctionV2Trace> {
44                    id: ctx.id.clone(),
45                    name: ctx.name.clone(),
46                    input: ctx.input.clone(),
47                    nodes: ctx.nodes.clone(),
48                    extensions: ctx.extensions.clone(),
49                    trace: ctx.config.trace.then(|| Default::default()),
50                    iteration: ctx.iteration,
51                    config: ctx.config,
52                    node: content.clone(),
53                };
54
55                FunctionV2NodeHandler.handle(v2_context).await
56            }
57        }
58    }
59}