use serde_json::Value;
use crate::{CompiledNode, ContextStack, DataLogic, Error, Result};
use std::collections::HashMap;
#[inline]
pub fn evaluate_throw(
args: &[CompiledNode],
context: &mut ContextStack,
engine: &DataLogic,
) -> Result<Value> {
let error_value = if args.is_empty() {
Value::Null
} else if let CompiledNode::Value { value } = &args[0] {
value.clone()
} else {
engine.evaluate_node(&args[0], context)?
};
let error_obj = if let Value::Object(_) = &error_value {
error_value
} else if let Value::String(s) = &error_value {
serde_json::json!({"type": s})
} else {
serde_json::json!({"type": error_value.to_string()})
};
Err(Error::Thrown(error_obj))
}
#[inline]
pub fn evaluate_throw_traced(
args: &[CompiledNode],
context: &mut ContextStack,
engine: &DataLogic,
collector: &mut crate::trace::TraceCollector,
node_id_map: &HashMap<usize, u32>,
) -> Result<Value> {
let error_value = if args.is_empty() {
Value::Null
} else {
engine.evaluate_node_traced(&args[0], context, collector, node_id_map)?
};
let error_obj = if let Value::Object(_) = &error_value {
error_value
} else if let Value::String(s) = &error_value {
serde_json::json!({"type": s})
} else {
serde_json::json!({"type": error_value.to_string()})
};
Err(Error::Thrown(error_obj))
}