Skip to main content

zen_engine/nodes/expression/
mod.rs

1use crate::model::ExpressionNodeContent;
2use crate::nodes::result::NodeResult;
3use ahash::HashMap;
4use std::rc::Rc;
5
6use crate::nodes::context::{NodeContext, NodeContextExt};
7use crate::nodes::definition::NodeHandler;
8use zen_expression::variable::{ToVariable, Variable};
9use zen_types::decision::TransformAttributes;
10
11#[derive(Debug, Clone)]
12pub struct ExpressionNodeHandler;
13
14pub type ExpressionNodeData = ExpressionNodeContent;
15pub type ExpressionNodeTrace = HashMap<Rc<str>, ExpressionNodeTraceItem>;
16
17impl NodeHandler for ExpressionNodeHandler {
18    type NodeData = ExpressionNodeData;
19    type TraceData = ExpressionNodeTrace;
20
21    fn transform_attributes(
22        &self,
23        ctx: &NodeContext<Self::NodeData, Self::TraceData>,
24    ) -> Option<TransformAttributes> {
25        Some(ctx.node.transform_attributes.clone())
26    }
27
28    async fn handle(&self, ctx: NodeContext<Self::NodeData, Self::TraceData>) -> NodeResult {
29        let result = Variable::empty_object();
30        let mut isolate = ctx.isolate();
31
32        for expression in ctx.node.expressions.iter() {
33            if expression.key.is_empty() || expression.value.is_empty() {
34                continue;
35            }
36
37            let value = isolate
38                .run_standard(&expression.value)
39                .with_node_context(&ctx, |_| {
40                    format!(r#"Failed to evaluate expression: "{}""#, &expression.value)
41                })?;
42            ctx.trace(|trace| {
43                trace.insert(
44                    Rc::from(&*expression.key),
45                    ExpressionNodeTraceItem {
46                        result: value.clone(),
47                    },
48                );
49            });
50
51            isolate.insert_dollar(&expression.key, value.clone());
52
53            result.dot_insert(&expression.key, value);
54        }
55
56        ctx.success(result)
57    }
58}
59
60#[derive(Debug, Clone, ToVariable)]
61pub struct ExpressionNodeTraceItem {
62    result: Variable,
63}