use adk_action::{CodeLanguage, CodeNodeConfig};
use serde_json::Value;
use crate::error::{GraphError, Result};
use crate::node::{NodeContext, NodeOutput};
pub async fn execute_code(config: &CodeNodeConfig, ctx: &NodeContext) -> Result<NodeOutput> {
let node_id = &config.standard.id;
let output_key = &config.standard.mapping.output_key;
match config.language {
CodeLanguage::Rust => execute_rust_code(config, ctx, node_id, output_key),
CodeLanguage::Javascript | CodeLanguage::Typescript => execute_js_code(node_id),
}
}
fn execute_rust_code(
config: &CodeNodeConfig,
ctx: &NodeContext,
node_id: &str,
output_key: &str,
) -> Result<NodeOutput> {
let code = &config.code;
tracing::debug!(node = %node_id, code_len = code.len(), "executing rust code node");
let result = if let Ok(json_value) = serde_json::from_str::<Value>(code) {
json_value
} else {
let state = &ctx.state;
let interpolated = adk_action::interpolate_variables(code, state);
Value::String(interpolated)
};
Ok(NodeOutput::new().with_update(output_key, result))
}
fn execute_js_code(node_id: &str) -> Result<NodeOutput> {
Err(GraphError::NodeExecutionFailed {
node: node_id.to_string(),
message: "JavaScript and TypeScript code nodes are not implemented, in any feature \
configuration; use language 'rust'"
.to_string(),
})
}