mirror of
https://github.com/gorules/zen.git
synced 2026-10-04 00:02:18 +00:00
feat: zen expression rewrite (#107)
* temp: zen-expression rewrite * rewrite standard parser * stabilise parser, upgrade dependencies * implement unary parser * align builtin behavior * fix tests and minor bugs * refactor exports, update docs * fix expression repl * cleanup * cleanup vm * replace expression with expression-rewrite * update d.ts file * fix failing test
This commit is contained in:
@@ -4,8 +4,6 @@ use pyo3::{pyfunction, PyObject, PyResult, Python, ToPyObject};
|
||||
use pythonize::depythonize;
|
||||
use serde_json::Value;
|
||||
|
||||
use zen_expression::isolate::Isolate;
|
||||
|
||||
use crate::value::PyValue;
|
||||
|
||||
#[pyfunction]
|
||||
@@ -14,45 +12,24 @@ pub fn evaluate_expression(
|
||||
expression: String,
|
||||
ctx: Option<&PyDict>,
|
||||
) -> PyResult<PyObject> {
|
||||
let isolate = Isolate::default();
|
||||
let ctx = ctx
|
||||
let context = ctx
|
||||
.map(|ctx| depythonize(ctx))
|
||||
.transpose()
|
||||
.context("Failed to convert context")?;
|
||||
.context("Failed to convert context")?
|
||||
.unwrap_or(Value::Null);
|
||||
|
||||
if let Some(env_value) = ctx {
|
||||
isolate.inject_env(&env_value);
|
||||
}
|
||||
|
||||
let result = isolate
|
||||
.run_standard(expression.as_str())
|
||||
let result = zen_expression::evaluate_expression(expression.as_str(), &context)
|
||||
.map_err(|e| anyhow!(serde_json::to_string(&e).unwrap_or_else(|_| e.to_string())))?;
|
||||
|
||||
Ok(PyValue(result).to_object(py))
|
||||
}
|
||||
|
||||
#[pyfunction]
|
||||
pub fn evaluate_unary_expression(
|
||||
py: Python,
|
||||
expression: String,
|
||||
ctx: &PyDict,
|
||||
) -> PyResult<PyObject> {
|
||||
let env_value: Value = depythonize(ctx).context("Failed to convert context")?;
|
||||
pub fn evaluate_unary_expression(expression: String, ctx: &PyDict) -> PyResult<bool> {
|
||||
let context: Value = depythonize(ctx).context("Failed to convert context")?;
|
||||
|
||||
let Some(env_object) = env_value.as_object() else {
|
||||
return Err(anyhow!("Context must be an object").into());
|
||||
};
|
||||
|
||||
if !env_object.contains_key("$") {
|
||||
return Err(anyhow!("Context must contain '$' reference.").into());
|
||||
}
|
||||
|
||||
let isolate = Isolate::default();
|
||||
isolate.inject_env(&env_value);
|
||||
|
||||
let result = isolate
|
||||
.run_unary(expression.as_str())
|
||||
let result = zen_expression::evaluate_unary_expression(expression.as_str(), &context)
|
||||
.map_err(|e| anyhow!(serde_json::to_string(&e).unwrap_or_else(|_| e.to_string())))?;
|
||||
|
||||
Ok(PyValue(result).to_object(py))
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user