zen_engine/nodes/function/
mod.rs

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