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: concat!(
"JavaScript/TypeScript code execution is not yet available. ",
"The 'action-code' feature is reserved for a future sandboxed JS runtime ",
"(quick-js). Use language 'rust' for code nodes, or contribute the ",
"quick-js integration to enable JS/TS support."
)
.to_string(),
})
}