feat: expose expressions through bindings; (#86)

* feat: expose expressions through bindings;

* fix fmt
This commit is contained in:
stefan-gorules
2023-09-14 16:07:55 +02:00
committed by GitHub
parent 1cef5bb263
commit 1b0ff9f6f1
14 changed files with 241 additions and 44 deletions
+50
View File
@@ -0,0 +1,50 @@
use napi::anyhow::anyhow;
use napi_derive::napi;
use serde_json::Value;
use zen_expression::isolate::Isolate;
#[allow(dead_code)]
#[napi]
pub async fn evaluate_expression(
expression: String,
context: Option<Value>,
) -> napi::Result<Value> {
let result: Value = napi::tokio::spawn(async move {
let isolate = Isolate::default();
if let Some(ctx) = context {
isolate.inject_env(&ctx);
}
isolate.run_standard(expression.as_str())
})
.await
.map_err(|_| anyhow!("Hook timed out"))?
.map_err(|e| anyhow!(serde_json::to_string(&e).unwrap_or_else(|_| e.to_string())))?;
Ok(result)
}
#[allow(dead_code)]
#[napi]
pub async fn evaluate_unary_expression(expression: String, context: Value) -> napi::Result<Value> {
let Some(context_object) = context.as_object() else {
return Err(anyhow!("Context must be an object").into());
};
if !context_object.contains_key("$") {
return Err(anyhow!("Context must contain '$' reference.").into());
}
let result: Value = napi::tokio::spawn(async move {
let isolate = Isolate::default();
isolate.inject_env(&context);
isolate.run_unary(expression.as_str())
})
.await
.map_err(|_| anyhow!("Hook timed out"))?
.map_err(|e| anyhow!(serde_json::to_string(&e).unwrap_or_else(|_| e.to_string())))?;
Ok(result)
}
+1
View File
@@ -1,3 +1,4 @@
mod decision;
mod engine;
mod expression;
mod loader;